原因は以下。
・Kerasで複数GPU対応をした。そのとき、with tf.device("/cpu:0"):
を追加してCPUでモデルを構築するようにした。
・その時はmulti_gpu_modelを使って複数GPUで動いた気がしたが、その後1GPUマシンで動かしたところGPUを使わなくなっていた。複数GPUマシンでも使ってくれない。
with tf.device("/cpu:0"):
を削除すると直った。これを書くところが悪かったんだろうか。。
参考:
原因は以下。
・Kerasで複数GPU対応をした。そのとき、with tf.device("/cpu:0"):
を追加してCPUでモデルを構築するようにした。
・その時はmulti_gpu_modelを使って複数GPUで動いた気がしたが、その後1GPUマシンで動かしたところGPUを使わなくなっていた。複数GPUマシンでも使ってくれない。
with tf.device("/cpu:0"):
を削除すると直った。これを書くところが悪かったんだろうか。。
参考:
export CUDA_VISIBLE_DEVICES="0"
のように環境変数を設定するとTensorFlowが使うGPUを指定出来る。
番号は0から順に割り振られる。グリッドサーチをするときに各学習にGPUを一つずつ割り当てて並列化する場合などに使う。
参考:
原因はモジュールを探しに行くところの一覧に読み込みたいモジュールがある場所が入ってないため。
/home/ubuntu/root/common/aws.py
を読みたい場合、
export PYTHONPATH="${HOME}/root:$PYTHONPATH"
のようにPYTHONPATHにプロジェクトRootを追加するとそこからの相対パスで読み込めるようになる。aws.pyを使う側は from common.aws import download
のように書けば関数を呼び出せる。
参考:
正しくはEBSのサイズは変わっているけどパーティションのサイズが変わってないので 使える容量は増えない。以下のコマンドを実行する必要がある。
sudo growpart /dev/xvda 1 sudo resize2fs /dev/xvda1
参考:
精度はデフォルトで64bitだが、以下の本には16bitでもほとんど精度は落ちないと書いていたので精度を下げてみた。
ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装
下げ方自体は簡単で、以下を実行するだけ。
tf.keras.backend.set_floatx('float16')
でもfloat16だと学習結果が大幅に悪くなってしまった。。16bit用の前処理が必要っぽい。 一旦何もしなくても大丈夫な32bitにしてます。
参考:
何もしなくても全GPUを使って学習してくれるかと思ってたけどそうではなかった。 以下のようにしてGPU数を渡してやると全GPUを使ってくれる。
def get_available_gpus(): local_device_protos = device_lib.list_local_devices() return [x.name for x in local_device_protos if x.device_type == 'GPU'] n_gpu = len(get_available_gpus()) if n_gpu >= 2: model = multi_gpu_model(model, gpus=n_gpu)
参考: