はじめに
機械学習の本番環境ではDockerコンテナでアプリをデプロイするのが標準的です。しかしDockerfileを雑に書くとイメージサイズが10GB超えて、デプロイに時間がかかり、コストも増加します。Dockerfileの軽量化テクニックを解説します。
イメージが肥大化する主な原因
PyTorch・TensorFlowなどの巨大ライブラリを不必要にフル版でインストールすることが最大の原因です。CUDA・cuDNNなどGPU関連ライブラリは開発環境では必要でも推論APIには不要なケースがあります。ビルド時の中間ファイルの残留(pip cacheやaptのキャッシュ)もサイズ増加の原因になります。複数のRUNコマンドで各レイヤーにキャッシュが積み重なることも問題です。
軽量化テクニック①:マルチステージビルド
# ビルドステージ
FROM python:3.11 AS builder
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir --user -r requirements.txt
# 本番ステージ(軽量ベースイメージ)
FROM python:3.11-slim AS production
WORKDIR /app
# ビルドステージの成果物だけコピー
COPY --from=builder /root/.local /root/.local
COPY . .
ENV PATH=/root/.local/bin:$PATH
CMD ["python", "app.py"]
マルチステージビルドで開発用の依存関係をビルドステージに隔離することで、本番イメージに不要なものを含めないようにできます。
軽量化テクニック②:CPU推論専用イメージの使用
# GPU版(約5GB)
FROM pytorch/pytorch:2.1.0-cuda12.1-cudnn8-runtime
# CPU専用版(約800MB)
FROM python:3.11-slim
RUN pip install torch --index-url https://download.pytorch.org/whl/cpu
推論APIはGPUなしでも動く場合が多く、CPU専用のPyTorchを使うだけでイメージサイズを大幅に削減できます。
軽量化テクニック③:依存関係の整理
# 推論だけに必要な最小限のライブラリ
numpy==1.24.3
scikit-learn==1.3.0
fastapi==0.103.0
uvicorn==0.23.2
# 不要なものを除外:
# - matplotlib(可視化→本番では不要)
# - jupyter(開発環境→本番では不要)
# - torch(sklearn使用時は不要)
軽量化テクニック④:レイヤーキャッシュの最適化
# 悪い例(変更のたびにpip installが走る)
COPY . .
RUN pip install -r requirements.txt
# 良い例(requirements.txtが変わらない限りキャッシュ有効)
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
Before/Afterの効果
最適化前:PyTorch(GPU版)フルイメージ → 約8GBのイメージ、デプロイ時間15分。最適化後:マルチステージ+CPU専用PyTorch → 約1.2GBのイメージ、デプロイ時間3分。イメージサイズを約85%削減、デプロイ時間を80%短縮という効果が得られました。クラウドのコンテナレジストリの保存コストも削減できます。
よくある質問
「本番でGPUが必要な場合はどうすればいいですか」という質問をよく受けます。GPU推論が必要なモデル(大規模深層学習モデル)の場合はGPU版イメージが必要です。ただしマルチステージビルドとpipキャッシュ削除(–no-cache-dir)で最小化を図りましょう。「distrolessイメージは使えますか」という質問については、GoogleのDistrolessイメージはシェルなしの最軽量イメージです。デバッグが難しくなるというトレードオフがありますが、セキュリティ重視の本番環境では有効な選択肢です。
まとめ
MLのDockerイメージ軽量化はマルチステージビルド・CPU専用ライブラリの使用・依存関係の整理・レイヤーキャッシュ最適化という4つのテクニックで実現できます。まず現在のイメージサイズを「docker images」で確認して、CPU推論専用への切り替えから始めることをおすすめします。
自分らしく働けるエンジニア転職を目指すなら【strategy career】
年収1000万・残業月30時間以下・リモート可の求人多数
※アフィリエイト広告を含みます
![]()


コメント