Skip to content

実践・機械学習モデルのデプロイ戦略:Docker, Kubernetes, そしてサーバーレス

はじめに

機械学習モデルを開発するだけでは、ビジネス価値を生み出すことはできません。モデルを本番環境にデプロイし、安定して運用することが不可欠です。本記事では、現代的なMLOps(Machine Learning Operations)の中核をなす3つの主要なデプロイ戦略、すなわちDocker、Kubernetes、そしてサーバーレスアーキテクチャについて、エンジニア向けに実践的な観点から解説します。

1. Dockerによるモデルのコンテナ化

モデルをデプロイする最初のステップは、その実行環境をパッケージ化することです。Dockerコンテナは、依存関係やライブラリを含めてアプリケーションを隔離し、どの環境でも一貫した動作を保証します。

なぜDockerか?

  • 環境の再現性: 開発環境と本番環境の差異をなくし、「自分のマシンでは動いたのに」という問題を解消します。
  • 依存関係の管理: requirements.txtPipfileだけでは管理しきれないシステムレベルの依存もカプセル化できます。
  • ポータビリティ: 一度コンテナ化すれば、Dockerが動作する任意の場所(オンプレミス、各種クラウド)で実行可能です。

Dockerfileの例

シンプルなFlaskアプリケーションで学習済みモデル(例:model.pkl)をサービングする際のDockerfileの例です。

Dockerfile
# ベースイメージの指定
FROM python:3.9-slim

# 作業ディレクトリの設定
WORKDIR /app

# 依存関係のコピーとインストール
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# アプリケーションコードとモデルのコピー
COPY . .

# ポートの開放
EXPOSE 5000

# アプリケーションの実行コマンド
CMD ["gunicorn", "-w", "4", "-b", "0.0.0.0:5000", "app:app"]

このDockerfileからイメージをビルドし、コンテナを実行するだけで、モデルAPIサーバーが起動します。

bash
docker build -t ml-model-api .
docker run -p 5000:5000 ml-model-api

2. Kubernetesによるコンテナオーケストレーション

単一のコンテナを動かすだけならDockerで十分ですが、本番環境ではスケーラビリティ、可用性、そして管理の自動化が求められます。ここでKubernetes(K8s)が登場します。

Kubernetesの利点

  • 自動スケーリング: CPU使用率などのメトリクスに基づいて、コンテナの数を自動で増減(オートスケール)できます。
  • 自己修復機能: コンテナがクラッシュした場合、自動的に再起動してサービスを継続します。
  • ローリングアップデート: アプリケーションを停止させることなく、新しいバージョンへのアップデートが可能です(ゼロダウンタイムデプロイ)。
  • 宣言的な構成管理: YAMLファイルでシステムのあるべき状態を定義し、K8sがその状態を維持するように動作します。

Kubernetesマニフェストの例 (deployment.yaml)

yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: ml-model-deployment
spec:
  replicas: 3 # 常に3つのPodを維持
  selector:
    matchLabels:
      app: ml-api
  template:
    metadata:
      labels:
        app: ml-api
    spec:
      containers:
      - name: ml-model-container
        image: your-repo/ml-model-api:latest # Docker HubやGCRなどのリポジトリ
        ports:
        - containerPort: 5000
        resources:
          requests:
            cpu: "500m"
            memory: "512Mi"
          limits:
            cpu: "1"
            memory: "1Gi"
---
apiVersion: v1
kind: Service
metadata:
  name: ml-model-service
spec:
  type: LoadBalancer # 外部からのアクセスを可能にする
  selector:
    app: ml-api
  ports:
    - protocol: TCP
      port: 80
      targetPort: 5000

このマニフェストをkubectl apply -f deployment.yamlで適用することで、高可用性を持つモデルサービングエンドポイントを構築できます。

3. サーバーレスアーキテクチャでのデプロイ

サーバーレスは、サーバーのプロビジョニングや管理を意識することなく、コード(関数)を実行できるアーキテクチャです。特に、リクエスト頻度が不規則な推論エンドポイントに適しています。

サーバーレスの利点

  • コスト効率: コードが実行されている時間だけ課金されるため、アイドル時間にはコストがかかりません。
  • 運用の簡素化: OSのパッチ適用やサーバー監視といった運用タスクから解放されます。
  • 自動スケーリング: リクエストの量に応じて、プラットフォームが自動でスケールしてくれます。

主要なサーバーレスプラットフォーム

  • AWS Lambda: イベント駆動型で、API Gatewayと組み合わせることで簡単にAPIを構築できます。
  • Google Cloud Functions: AWS Lambdaと同様のサービス。Firebaseとの統合が強力です。
  • Knative: Kubernetes上でサーバーレスワークロードを実現するためのオープンソースプラットフォーム。既存のK8sクラスタを活用できます。

サーバーレスの考慮事項

  • コールドスタート: 関数がしばらく呼び出されないと、次回の初回起動時に遅延が発生することがあります。
  • 実行時間の制限: 長時間実行される処理(特にバッチ学習など)には向いていません。
  • ステートレス: 関数は状態を持たないため、データベースなどの外部ストレージが必要です。

まとめ:どの戦略を選ぶべきか?

戦略適したユースケースメリットデメリット
Docker開発、テスト、小規模なデプロイ環境の標準化、ポータビリティ単体ではスケーリングや可用性に課題
Kubernetes大規模、高可用性が求められる本番環境高度な自動化、スケーラビリティ、回復力学習コストが高い、管理が複雑
サーバーレス不規則なトラフィック、イベント駆動の推論低コスト、運用負荷の軽減、自動スケールコールドスタート、実行時間制限

多くの場合、これらの技術は組み合わせて利用されます。Dockerでモデルをコンテナ化し、Kubernetesクラスタ上で管理しつつ、特定の非同期タスクにはサーバーレス関数を利用する、といったハイブリッドなアプローチが一般的です。

プロジェクトの規模、チームのスキルセット、そしてコスト要件を総合的に評価し、最適なデプロイ戦略を選択することが成功への鍵となります。

AI が自動生成した技術記事をまとめたテックブログ