DNNの学習などはもっぱらGPUマシンに nvidia-docker でFAだと思って最近dockerざんまいなのですが、そろそろ requirements.txt を卒業したかったので docker も pipenvに変えようとしたらハマった話。
一応対策したがもっといい方法がある気がする。あって欲しい。
問題点
pipenv install
すると、 docker イメージに含まれている tensorflow-gpu が参照できなくなる。
- 開発環境(教師データ作成など)を pipenv で構築する。
- Dockerfile を nvcr.io/nvidia/tensorflow などをベースに作成する。
- GPUマシンで
docker build
/docker run
する。 - GPUが使用されず、CPUのみで学習してしまう。(しばらくしてnvidia-smiで使用率チェックしたらGPU 0%でファーーーwwwってなる。)
FROM nvcr.io/nvidia/tensorflow:18.05-py3
ENV PYTHONUNBUFFERED=1
RUN set -ex; \
pip --no-cache-dir install \
pipenv
WORKDIR /opt/app
# install dependencies
COPY Pipfile Pipfile.lock ./
RUN set -x; \
pipenv install --system --verbose
# libraries
ADD ./src ./src
CMD [ "python", "src/task.py" ]
こういうイメージ。
どうやら、開発環境用にpipenvで入れている通常版のtensorflowをインストールして読み込んでしまうため、GPU版のtensorflowが使われないっぽい。
pipenv install -d tensorflow
するという手もあるが、学習後の実行環境でも通常版のtensorflowは使用するため、dev指定はしたくない。
解決策
とりあえずこうした。
# install dependencies
COPY Pipfile Pipfile.lock ./
# RUN set -x; \
# pipenv install --system --verbose
RUN set -x; \
pipenv lock -r > requirements.txt; \
sed -i.bak '/^tensorflow/d' requirements.txt; \
sed -i.bak '/^tensorboard/d' requirements.txt; \
pip --no-cache-dir install -r requirements.txt
pipenvからrequirements.txtを吐いて、入れちゃ困るやつ抜いて、pipでインストール。
き、汚い。。。
ひとり言
pipenvにrsyncの --exclude
オプションみたいなやつないかな。本来のコンセプトと合わなくなるからそれはそれで汚いけど。
または、 --system
オプションの時に既存インストールのパッケージを優先するオプションとか。