日々精進

新しく学んだことを書き留めていきます

KerasがGPUを使ってくれなくて困った問題

原因は以下。 ・Kerasで複数GPU対応をした。そのとき、with tf.device("/cpu:0"): を追加してCPUでモデルを構築するようにした。 ・その時はmulti_gpu_modelを使って複数GPUで動いた気がしたが、その後1GPUマシンで動かしたところGPUを使わなくなっていた。複数GPUマシンでも使ってくれない。

with tf.device("/cpu:0"): を削除すると直った。これを書くところが悪かったんだろうか。。

参考:

tech.wonderpla.net

keras.io

PythonでModuleNotFoundError: No module namedエラー

原因はモジュールを探しに行くところの一覧に読み込みたいモジュールがある場所が入ってないため。 /home/ubuntu/root/common/aws.py を読みたい場合、 export PYTHONPATH="${HOME}/root:$PYTHONPATH" のようにPYTHONPATHにプロジェクトRootを追加するとそこからの相対パスで読み込めるようになる。aws.pyを使う側は from common.aws import download のように書けば関数を呼び出せる。

参考:

stackoverflow.com

EBSはAWSコンソールから拡張設定しただけでは拡張されない

正しくはEBSのサイズは変わっているけどパーティションのサイズが変わってないので 使える容量は増えない。以下のコマンドを実行する必要がある。

sudo growpart /dev/xvda 1
sudo resize2fs /dev/xvda1

参考:

qiita.com

Kerasで浮動小数点数の精度を下げて効率を上げる

精度はデフォルトで64bitだが、以下の本には16bitでもほとんど精度は落ちないと書いていたので精度を下げてみた。

ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

下げ方自体は簡単で、以下を実行するだけ。

tf.keras.backend.set_floatx('float16')

でもfloat16だと学習結果が大幅に悪くなってしまった。。16bit用の前処理が必要っぽい。 一旦何もしなくても大丈夫な32bitにしてます。

参考:

qiita.com

Kerasで複数GPUを使って学習する

何もしなくても全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)

参考:

stackoverflow.com