Docker環境を使って機械学習の推論をする場合、モデルファイルをどのように保持するのかという問題に付きあたる。
モデルファイルのダウンロード、モデルファイルの最適化 optimizeなどの処理をDocker環境の構築 docker build あるいは Docker環境の中で 毎回行うのは、時間がかかりすぎてもったいない。
「ねえ、動いているのを見せてよ」となったときに、docker run の直後にすぐに実行してみせたい。
選択肢1:Dockerfileの中に手順を記述する。
例: wget, gdown などを使って、指定のURLからダウンロードする。
RUN wget -o {保存するファイル名} ${URL}
選択肢2:保存先のディレクトリを、host環境のフォルダとする。
pretrained モデルをダウンロードするのが、推論時に実行するスクリプトの中で行われている場合もある。
標準時の状況
この場合には、ダウンロードが、guest環境内のディスク領域に保存される。
docker run --rm
のオプションが指定されているときには
guest環境内のディスク領域は、基本毎回再構築される。
docker run -it --rm --net=host --runtime nvidia -e DISPLAY=$DISPLAY \
-v ${GIT_ROOT}/depth-anything-zed/weights:/root/depth-anything-zed/weights \
この例では、weightsのフォルダをhost環境をマウントしておくことで永続化させている。
こうすれば、既にダウンロード済みのファイルがあるときには、再度のダウンロードをしなくて済む。
選択肢3:docker run 時の --rm オプションを付けない。
こうすると、docker runを実行するたびに、前のディスクの状況が引き継がれるようになる。
利点: これだけで、dockerのguest環境のディスクの状況が保持される。
欠点: 毎回の動作が、それまでの動作結果のディスクの状況で影響受ける。
発生しやすくなるトラブル:
今の環境では、たまたまあるファイルがディスクにあるので動作している。
しかし、別の環境ではそのファイルがないので動作しない。
そういうことが起こりやすくなる。
基本、おすすめしない。
追記: ZED SDK のDEPTH_MODE.NEURAL_PLUSを利用の場合
上記のモードでは、実行時にモデルをダウンロードし、optimizeを実行している。
実行後に以下のファイルが作られている。
このファイルはzed_sdk のインストーラーの実行では、生成されない。
/usr/local/zed/resouces/neural_depth_3.6.model
選択肢3のやり方では対処できなかった。
選択肢2のやり方を応用して対処するのがいいだろう。
USER_WEIGHT_CACHE のようなところを永続化の領域とする。
- /usr/local/zed/resouces/neural_depth_3.6.model がなくて、USER_WEIGHT_CACHEにあれば、
USER_WEIGHT_CACHEのを/usr/local/zed/resouces/neural_depth_3.6.modelにコピーする。 - どちらにもなければ、何もしない。
- python3 スクリプト.py
- USER_WEIGHT_CACHEになければ、/usr/local/zed/resouces/neural_depth_3.6.modelをUSER_WEIGHT_CACHEにコピーする。
- docker環境を終了する。
こんな手順になるだろうか。