星期日, 12月 17, 2023

Rust - 參數輸入與 Exit Code

初次看到 Rust 的 main function 時

fn main() {
	println!("Hello World");
}

還以為是與 C 一樣可以透過在 main 在加參數來取得參數。但實際上像 Python 一樣需要透過別的 crate 來處理。

底下是一個輸出所有輸入參數的範例

use std::env;

fn main() {
	let args: Vec<String> = env::args().collect();
    
    for arg in args {
    	println!("{}", arg);
    }
}
env::args() 會取得 iterator,因此範例也可以簡單寫成
use std::env;

fn main() {
    for arg in env::args() {
    	println!("{}", arg);
    }
}
而回傳 Exit Code 的部份, C 是在 main function 回傳 int,而 Rust 是回傳有實做 Termination trait 的物件 (實做了 fn report() -> ExitCode) 即可

而在 Terminalion Trait 中,為以下五種型別定義了實做

  • Infallible
  • !
  • ()
  • ExitCode
  • <T: Termination, E: Debug> Termination for Result<T, E>

前兩者我目前不懂,對於後三者來說

一律回傳成功

fn main() -> () {
	// 表示回傳 ExitCode::SUCCESS
}

回傳指定 ExitCode

use std::process::ExitCode;

fn main() -> ExitCode {
    return ExitCode::SUCCESS;
}

若想返回任意值,可以用

use std::process::ExitCode;

fn main() -> ExitCode {
    return ExitCode::from(0);
}

執行成功時,使用 Ok(T) 中的 T 的 report 結果,若是錯誤則輸出 Err(E) 中的 Debug 訊息並回傳 ExitCode::FAILURE

use std::fs::File;

fn main() -> Result<(), std::io::Error> {
   let f = File::open("bar.txt");

   match f {
      Ok(_) => {
         return Ok(());
      },
      Err(e) => {
         return Err(e);
      },
   };
}
這種 Return 執行錯誤會得到 stderr 的輸出
Error: Os { code: 2, kind: NotFound, message: "No such file or directory" }
上一個 code 也可以寫成
use std::fs::File;

fn main() -> Result<(), std::io::Error> {
	let f = File::open("bar.txt")?;
	// ? 若執行結果是 Err, 直接 return 該 Err
	Ok(())
}
若想隨時中止,可以使用 std::process:exit
fn main() {
   std::process::exit(1);
}

星期日, 12月 10, 2023

在 Linux 上使用 RX6600 跑 whisper

出於個人需求,需要使用 whipser 將影片中的對話轉成文字

whisper 是由 OpenAI 出品的語音辨識 Model,運行在 PyTorch 這個機器學習框架上。>

在這裡我使用 venv 來進行安裝

$ python3 -mvenv whisper
$ soruce whisper bin/activate

然後到 PyTorch 官網查看安裝 PyTorch With ROCM 的安裝方法,ROCM 是由 AMD 開發與 NVIDIA CUDA 對標的開發平台。

在這裡我們運行

(whisper) $ pip3 install torch torchvision torchaudio \
	--index-url https://download.pytorch.org/whl/rocm5.6

安裝完畢後嘗試執行,結果 Segmentation Fault 了

(whisper) $ whisper --language zh input.mkv
segmentation fault (coredumpd)

可能跟 RX6600 在 ROCM 只支援 Windows 有關,經過一番搜尋後,發現使用 HSA_OVERRIDE_GFX_VERSION=10.3.0 可以順利運行

(whisper) $ HSA_OVERRIDE_GFX_VERSION=10.3.0 whisper --language zh input.mkv

根據 https://llvm.org/docs/AMDGPUUsage.html, gfx1030 是指 RX6800XT 以上的顯卡

而 RX6600 的 code name 為 gfx1032

$ ocminfo | grep gfx
  Name:                    gfx1032                            
      Name:                    amdgcn-amd-amdhsa--gfx1032

先這樣使用一段時間看有沒有問題,跑起來比純用 CPU 實在快太多了

另外發現 CPU 1 Core 吃滿的,但 GPU 耗電上限 100W 只吃 66W,可能是遇到 CPU 瓶頸了...,老舊的 2700x 該升級了嗎