---
# System prepended metadata

title: Kaldi 有效率實行多GPU方法
tags: [kaldi]

---

# Kaldi 有效率實行多GPU方法



程式碼
---
```
CUDA_VISIBLE_DEVICES=0,1,2,3 <your_script>.sh <your_arguments> --num_jobs_initial x --num_jobs_final y 

eg:
CUDA_VISIBLE_DEVICES=0,1,2,3 local/chain/run_tdnn_tranferWeights_indep.sh --stage 9 --fold 0 --num_jobs 15 --affix _DAAIKIDAug_Deceipt_ADOSfold0_AddADOSNoise --train_stage 40 --num_jobs_initial 3 --num_jobs_initial 3 
```

解釋： 首先在所有程式之前加上CUDA_VISIBLE_DEVICES=?就等於是那個程式會使用你加上的環境變數來執行，在這邊CUDA_VISIBLE_DEVICES指得是你的程式可以看得到的GPU，通常可以依照你可以用的GPU來設定。

接著，num_jobs_initial 和 num_jobs_initial 會控制你跑在GPU上面的process數量， 這兩個數值通常都要小於等於你能看得到的GPU數（除非你的GPU能夠裝兩個以上的job）。

額外補充
---

1. 通常官方文件裡面會建議你先設定nvidia-smi -c 3， 這行指令意思是當某個GPU上跑了一個process之後，其他process就不能跑在那個GPU上，然而根據[1](https://www.zhihu.com/question/55485355)敘述我們有辦法可以在nvidia-smi -c 0(default mode)之下還能多gpu不error， 按照[1](https://www.zhihu.com/question/55485355)的作法，會需要動到kaldi script當中執行train_new_model（）的地方。然而這邊我有一個小地方要補充，[1](https://www.zhihu.com/question/55485355)用的是steps/nnet3/train_raw_dnn.py，如果我們要用的是steps/nnet3/chain/train.py的話就變成要更改steps/libs/nnet3/train/chain_objf/acoustic_model.py
2. [1](https://www.zhihu.com/question/55485355)裡面有提到kaldi原生的queue.pl可以拿來控制CPU,GPU等運算資源，但queue.pl設定上似乎比較複雜，雖然可以拿來控多GPU，但我們採用上面的方法比較省時省力。
###### tags: `kaldi`
