【AI時代のLinuxエンジニア生存戦略】第3回:MLOpsとLinux〜AIモデルを安定稼働させる究極のインフラ設計術

こんにちは!「LINUX工房」管理人の「リナックス先生」です。
大好評の「AI時代のLinuxエンジニア生存戦略」シリーズ、第3回へようこそ!

現在、世の中の企業はこぞって「自社専用のAI(LLM)を作ろう」「AIをサービスに組み込もう」と躍起になっています。そのため、AIのアルゴリズムを作る「データサイエンティスト」や「機械学習エンジニア」が大量に採用されています。

しかし、ここで現場に「ある悲劇」が起こります。データサイエンティストが手元のハイスペックなPCで作ったAIモデルを、いざ本番のクラウドサーバー(AWSやGCP)にデプロイしようとした瞬間、全く動かないのです。

コウ君

先生、僕の会社でもまさにそれが起きています!AIチームから「モデルが完成したから、あとはWebで公開しておいて」ってPythonのコードを渡されたんですが、本番のUbuntuサーバーで実行したら CUDA Out of memory とか NVIDIA driver mismatch っていう謎のエラーが大量に出て、サーバーごとフリーズしちゃいました……。
AIって、プログラミング言語(Python)だけ分かっていれば動くものじゃないんですか?

リナックス先生

コウ君、それは『機械学習のコード』と『それを動かすインフラ』の境界線を見誤っている証拠よ!
データサイエンティストは「AIの脳みそ」を作るプロだけど、その脳みそを「サーバーという肉体」に繋ぎ合わせて、何万人ものユーザーのアクセスに耐えられるようにするのはインフラエンジニア(Linuxエンジニア)の仕事なの。
この『AIを本番環境で安定稼働させるための運用技術』をMLOps(Machine Learning Operations)と呼ぶわ。今日は、AIを飼い慣らすための「究極のインフラ設計術」を叩き込むわよ!

本記事では、対象OSを最新の Ubuntu 26.04 LTS (Linux Kernel 7.0) に設定し、NVIDIA GPUドライバの深層アーキテクチャから、AI特有のメモリ枯渇(OOM)を防ぐカーネルチューニング、そして推論サーバーのコンテナ化まで、プロのMLOpsインフラ技術を8000文字超の圧倒的ボリュームで完全解説します。

🛡️ AI時代のLinuxエンジニア生存戦略・連載ロードマップ(全8回)


    1. 🛡️ AI時代のLinuxエンジニア生存戦略・連載ロードマップ(全8回)
  1. 1. MLOpsとは何か? 「研究」を「本番サービス」へ昇華させる技術
    1. 1-1. DevOpsとMLOpsの決定的な違い
  2. 2. AIインフラの心臓部「GPU」とLinuxカーネルの階層構造
    1. 2-1. NVIDIA GPUのソフトウェアスタック(下から上へ)
  3. 3. 地獄のNVIDIAドライバ&CUDA環境構築(Ubuntu 26.04版)
    1. 3-1. nouveauドライバの無効化(競合回避)
    2. 3-2. ubuntu-driversによる自動インストール
    3. 3-3. 稼働確認(nvidia-smi)
  4. 4. GPUコンテナ時代の幕開け:NVIDIA Container Toolkitの導入
    1. 4-1. Toolkitのインストール手順(Ubuntu 26.04向け)
    2. 4-2. コンテナからのGPUアクセス・テスト
  5. 5. OOM Killerとの戦い:巨大化するLLMとLinuxメモリ管理
    1. 5-1. Linuxの「オーバーコミット(Overcommit)」の罠
    2. 5-2. AI特化の sysctl カーネルチューニング
  6. 6. AIの「推論(Inference)」APIサーバー構築とNginxリバースプロキシ
    1. 6-1. Docker Composeによる推論サーバーの定義
    2. 6-2. Nginxの「AI特化型」リバースプロキシ設定
  7. 7. クラウド破産を防ぐ!GPUリソース監視と cgroups v2
    1. 7-1. nvtopによるグラフィカルなGPU監視
    2. 7-2. Ubuntu 26.04とcgroups v2によるリソース制限
  8. 8. AIを活用した「MLOpsインフラコード(IaC)」の自動生成プロンプト
    1. 8-1. MLOps環境構築の神プロンプト
  9. 総まとめ:データサイエンティストを救うのはLinuxエンジニアである
    1. ▼ AIインフラを実践環境でぶん回そう ▼

1. MLOpsとは何か? 「研究」を「本番サービス」へ昇華させる技術

近年よく耳にする「MLOps(Machine Learning Operations)」。これは、従来の「DevOps(開発と運用の統合)」の概念を、機械学習(AI)の領域に拡張したものです。

1-1. DevOpsとMLOpsの決定的な違い

通常のWebアプリ開発(DevOps)と、AIモデルの開発・運用(MLOps)では、インフラエンジニアが直面する課題が全く異なります。

比較項目 従来のWebアプリ(DevOps) AI・機械学習(MLOps)
扱うコード(成果物) プログラムのソースコード(静的) ソースコード + 巨大なモデルデータ(重み) + 訓練データ
ハードウェア要件 CPUとメモリ(スケーラビリティ重視) GPU(VRAM)への強烈な依存。 特殊なドライバ環境が必須。
パフォーマンスの劣化 バグがない限り、性能は劣化しない。 データドリフト(環境変化)により、AIの予測精度が時間とともに劣化する。 定期的な再学習(再デプロイ)が必要。
リクエストの性質 数ミリ秒〜数百ミリ秒で完了する軽い処理。 1リクエストの処理(推論)に数秒〜数分かかる重い処理。タイムアウト設定の概念が根本から異なる。

データサイエンティストは「精度(Accuracy)」を追求しますが、インフラエンジニアは「安定性(Reliability)」と「速度(Latency)」を追求します。
彼らが作成した数GBに及ぶ巨大なAIモデル(PyTorchなどのファイル)を、いかに少ないメモリで動かし、いかにNginxのタイムアウトを回避しながらユーザーに返答を届けるか。ここからが我々Linuxエンジニアの腕の見せ所です。


2. AIインフラの心臓部「GPU」とLinuxカーネルの階層構造

AIを動かすインフラにおいて最も厄介なのが「GPU(Graphics Processing Unit)」の扱いです。
サーバーに搭載された高価なNVIDIA製GPU(H100やA100など)の計算能力を引き出すためには、Linuxカーネルからアプリケーション層に至るまで、複雑な「ソフトウェアスタック(階層構造)」を完璧に一致させる必要があります。

2-1. NVIDIA GPUのソフトウェアスタック(下から上へ)

プロのインフラエンジニアは、エラーが出た際に「どの階層でエラーが起きているか」を即座に切り分けます。

レイヤー ソフトウェア名 / 役割 トラブルシューティングのポイント
ハードウェア層 NVIDIA GPU (物理デバイス), PCIeバス lspci | grep -i nvidia でOSが物理的に認識しているか確認。
OS/カーネル層 Linux Kernel 7.0 (Ubuntu 26.04) オープンソースの nouveau ドライバと、NVIDIA公式プロプライエタリドライバの競合(衝突)が起きていないか確認。
ドライバ層 NVIDIA Driver (例: 550.xx) nvidia-smi コマンドが応答するか。ここで失敗すればカーネルモジュールのビルド(DKMS)失敗。
API/ライブラリ層 CUDA Toolkit, cuDNN Pythonライブラリが要求するCUDAバージョンと、システムに入っているCUDAバージョンが一致しているか(現場のトラブルの8割はこれ)。
アプリケーション層 PyTorch, TensorFlow, vLLM import torch; torch.cuda.is_available()True を返すか確認。
コウ君

うわぁ……。ただインストールすればいいだけじゃないんですね。ドライバのバージョンと、CUDAのバージョンと、PyTorchのバージョン……全部パズルみたいにピッタリ合わせないと動かないなんて、気が狂いそうです!

リナックス先生

その通り!ホストOS(Ubuntu本体)に直接これらの環境を作ろうとすると、AIモデルAとAIモデルBで要求されるバージョンが違った瞬間に『依存関係地獄』に陥ってシステムが壊壊するわ。
だから現代のMLOpsでは、ホストOSには「NVIDIAドライバだけ」を入れて、残りのCUDAやPyTorchの環境はすべて「Dockerコンテナの中に隔離する」のが絶対的なベストプラクティスなのよ!


3. 地獄のNVIDIAドライバ&CUDA環境構築(Ubuntu 26.04版)

ホストOSを汚さないコンテナ戦略をとるにしても、土台となるUbuntu 26.04上に「NVIDIAドライバ」だけは確実にインストールしなければなりません。最新の環境で最も安全な導入手順を解説します。

3-1. nouveauドライバの無効化(競合回避)

Ubuntuには初期状態で nouveau というオープンソースのGPUドライバが組み込まれています。これが有効なままだと、NVIDIA公式ドライバと衝突してカーネルパニックを起こします。

# nouveauドライバをブラックリスト(ロード禁止)に登録
echo "blacklist nouveau" | sudo tee /etc/modprobe.d/blacklist-nouveau.conf
echo "options nouveau modeset=0" | sudo tee -a /etc/modprobe.d/blacklist-nouveau.conf

# カーネルの初期RAMディスクを再生成して設定を反映
sudo update-initramfs -u

# 一度再起動します
sudo reboot

3-2. ubuntu-driversによる自動インストール

Ubuntuには、現在搭載されているハードウェアに最も適した(安定した)プロプライエタリドライバを自動判定してインストールしてくれる神コマンド ubuntu-drivers があります。

# どのドライバが推奨(recommended)されているか確認
ubuntu-drivers devices

# 推奨ドライバを自動インストール
sudo ubuntu-drivers autoinstall

# インストール後、カーネルモジュールを有効化するために再起動
sudo reboot

3-3. 稼働確認(nvidia-smi)

再起動後、以下のコマンドを打ちます。インフラエンジニアがAIサーバーを運用する際、1日に100回は打つコマンドです。

nvidia-smi

美しい表が表示され、GPUの型番(例:Tesla T4)、現在の温度、メモリ(VRAM)の使用量、そして右上に Driver VersionCUDA Version が表示されていれば、第一関門突破です。


4. GPUコンテナ時代の幕開け:NVIDIA Container Toolkitの導入

ホストOSにドライバが入りました。次に、第7回で学んだ「Docker」の中から、この物理GPUにアクセスできるようにするための橋渡し役、「NVIDIA Container Toolkit」をインストールします。
(※昔は nvidia-docker2 と呼ばれていましたが、現在は非推奨となり、最新アーキテクチャであるCDIを用いたToolkitに移行しています)。

4-1. Toolkitのインストール手順(Ubuntu 26.04向け)

# NVIDIA公式リポジトリのGPGキーを追加
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg

# リポジトリ設定ファイルの作成
curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
  sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
  sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list

# パッケージリストの更新とインストール
sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit

# DockerデーモンにNVIDIAランタイムを設定するよう設定ファイルを自動構成
sudo nvidia-ctk runtime configure --runtime=docker

# Dockerの再起動
sudo systemctl restart docker

4-2. コンテナからのGPUアクセス・テスト

設定が完了したら、Dockerコンテナの中からGPUが見えるかテストします。--gpus all という魔法のフラグを付与して実行します。

# NVIDIA公式の軽量CUDAコンテナを立ち上げ、中で nvidia-smi を実行させる
docker run --rm --gpus all nvidia/cuda:12.6.0-base-ubuntu26.04 nvidia-smi

ホストOSで打った時と同じ表が表示されれば、MLOpsインフラの土台は完璧に完成です!これで、データサイエンティストが作ったどんなAIモデルのコンテナ(PyTorchだろうがTensorFlowだろうが)も、あなたのサーバー上で爆速で稼働させることができます。


5. OOM Killerとの戦い:巨大化するLLMとLinuxメモリ管理

AIモデル(特に数十億パラメータを持つLLM)を動かす際、インフラエンジニアを最も悩ませるのが「メモリ枯渇による突然死(OOM Killer)」です。
LLMは、モデルのデータ(重み)をすべてGPUのメモリ(VRAM)にロードしなければ高速に動作しません。さらに、データの前処理を行うためにホストのシステムメモリ(RAM)も大量に消費します。

5-1. Linuxの「オーバーコミット(Overcommit)」の罠

Linuxカーネルには「オーバーコミット(メモリの過剰割り当て)」というお節介な機能があります。プログラムが「10GBメモリを確保させて!」と要求した時、実際にはそんなに空きがなくても、Linuxは「いいよ!」と嘘をついて許可を出します。
しかし、AIプログラムがいざ実際に10GBのデータを書き込もうとした瞬間、「ごめん、やっぱり物理メモリ足りなかったわ」となり、Linuxはシステム崩壊を防ぐために一番重いプロセス(AIのコンテナ)を無慈悲に殺害(OOM Kill)します。

PR

5-2. AI特化の sysctl カーネルチューニング

AIワークロードにおいて、この「突然死」を防ぎ、安定稼働させるためには、カーネルのメモリ管理哲学をAI向けにチューニング(sysctl)する必要があります。

sudo nano /etc/sysctl.conf

以下のプロ仕様のパラメータを追記します。

# ==========================================
# MLOps / AIワークロード向け カーネルチューニング
# ==========================================

# 1. オーバーコミットの制限
# 無責任なメモリ割り当てを禁止し、物理RAM+Swapの一定割合(ここでは90%)までしか許可しない
vm.overcommit_memory = 2
vm.overcommit_ratio = 90

# 2. Swappiness(スワップの積極性)の極小化
# AI処理においてデータがディスク(Swap)に退避されると、GPUとのデータ転送(PCIeバス)がボトルネックになり性能が1/100に落ちるため、極力Swapを使わないようにする
vm.swappiness = 1

# 3. 最大マップカウントの引き上げ(Elasticsearchや分散DB連携時必須)
# プロセスが確保できるメモリマップ領域の上限を劇的に引き上げる
vm.max_map_count = 262144

保存後、sudo sysctl -p で反映させます。これで、OSが不用意にAIプロセスを殺す事故を未然に防ぐことができます。


6. AIの「推論(Inference)」APIサーバー構築とNginxリバースプロキシ

データサイエンティストから渡されたAIモデルを、最終的にユーザーがブラウザやアプリから使えるようにするためには、「HTTPリクエストを受け取り、AIに推論(計算)させ、結果を返す」APIサーバーを構築する必要があります。

6-1. Docker Composeによる推論サーバーの定義

Pythonの超高速Webフレームワーク「FastAPI」や、大規模言語モデル推論用エンジン「vLLM」を使ったコンテナを立ち上げる docker-compose.yml の構成例です。インフラエンジニアがこの設計図を書きます。

services:
  # AI推論APIコンテナ
  ai-api:
    image: my-ai-model:v1
    container_name: inference_server
    restart: always
    ports:
      - "8000:8000"
    # ここが肝!コンテナにGPUを認識させる設定
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: 1       # 1基のGPUを使用
              capabilities: [gpu]
    # メモリ上限を明示的に設定し、ホストOS全体を巻き込んで死ぬのを防ぐ
    deploy:
      resources:
        limits:
          memory: 32G

6-2. Nginxの「AI特化型」リバースプロキシ設定

第6回で構築したNginxをフロントエンドに置きますが、AIの推論は「1回のリクエストに対する応答(生成)に、数秒から数十秒かかる」という特殊な性質を持っています。通常のNginx設定では、数秒で「504 Gateway Timeout」エラーになってしまいます。

AI推論用のNginxサーバーブロック設定(/etc/nginx/sites-available/ai-api.conf)は、タイムアウト時間を極限まで伸ばすのがプロの鉄則です。

server {
    listen 80;
    server_name api.example.com;

    location / {
        proxy_pass http://localhost:8000;
        
        # クライアントからの画像アップロード(推論用データ等)に備え、上限を100MBに拡張
        client_max_body_size 100M;

        # !!超重要:AI推論タイムアウトの延長(デフォルト60秒 → 300秒へ)!!
        proxy_connect_timeout 300s;
        proxy_send_timeout 300s;
        proxy_read_timeout 300s;
        send_timeout 300s;

        # HTTP/1.1の利用とConnectionの保持(ストリーミング応答、WebSocket等のため)
        proxy_http_version 1.1;
        proxy_set_header Connection "";
    }
}

このタイムアウト設定を知らずにデプロイし、「裏側のAIは推論を完了したのに、Nginxが先に通信を切断してしまってエラーになる」というトラブルが、全国のAI開発現場で多発しています。インフラエンジニアのあなたが、この設定でチームを救うのです。


7. クラウド破産を防ぐ!GPUリソース監視と cgroups v2

GPUサーバー(AWSのp4dインスタンス等)は、1時間あたり数千円という莫大なクラウド料金がかかります。もし、バグのあるPythonスクリプトが無限ループに入り、GPUを100%消費したまま放置されれば、あっという間に「クラウド破産」を引き起こします。

7-1. nvtopによるグラフィカルなGPU監視

通常の tophtop コマンドでは、GPUの負荷は見えません。Ubuntu環境では、必ず nvtop(NVIDIA TOP)という専用の監視ツールをインストールします。

sudo apt update
sudo apt install nvtop -y

# 監視の実行
nvtop

ターミナル上に、GPUの温度、VRAM使用率、そして「どのPID(LinuxのプロセスID)がGPUを占有しているか」が美しいグラフと共にリアルタイム表示されます。

7-2. Ubuntu 26.04とcgroups v2によるリソース制限

もし特定のコンテナ(AIモデル)がGPUやメモリを独占しているのを発見した場合、Ubuntu 26.04で標準採用されている cgroups v2(コントロールグループ) の機能を使って、OSレベルでプロセスのリソースを「力技で押さえつける」ことができます。

前述の `docker-compose.yml` での limits: memory: 32G という記述は、裏側でこの cgroups v2 のAPIを呼び出し、「このコンテナのグループは絶対に32GB以上のメモリを使わせない」という鉄の檻(制限)をLinuxカーネルに作らせているのです。


8. AIを活用した「MLOpsインフラコード(IaC)」の自動生成プロンプト

GPUドライバのインストールからDockerの設定、Nginxのルーティングまで。これらを手動で行うのは骨が折れます。ここで再び、AI(GeminiやChatGPT)を強力な「インフラ構築の部下」として活用しましょう。

8-1. MLOps環境構築の神プロンプト

「あなたはシニアMLOpsアーキテクトです。
Ubuntu 26.04 LTS (Kernel 7.0) のベアメタルサーバー上に、NVIDIA GPUを活用した生成AIの推論API環境を構築します。

以下の要件を満たす『Ansible Playbook』、または『初期構築のシェルスクリプト』を生成してください。

【要件】
1. OSのチューニング: `sysctl` を用いて、OOM Killer対策として overcommit_memory を 2 に設定し、swappiness を 1 にする。
2. ドライバ: `ubuntu-drivers autoinstall` を用いて最新のNVIDIAドライバを導入する。
3. コンテナ環境: Docker Engineの公式インストール手順に加え、`nvidia-container-toolkit` を導入し、Dockerランタイムに設定する。
4. Nginx設定: AIの長時間の推論待ち(Server-Sent Events / ストリーミング応答を含む)に対応するため、タイムアウトを300秒に延長したリバースプロキシの設定ファイルを配置する。

生成するコードは安全かつ冪等性(何度実行しても同じ結果になること)を担保し、各ステップに詳しい日本語のコメントを記述してください。」

このプロンプトを使えば、本記事で解説したすべてのノウハウが詰め込まれた「完全自動構築スクリプト」が一瞬で生成されます。
「インフラの真理(Linuxの仕様)を人間が理解し、面倒なコードの記述はAIに任せる」。これこそが、AI時代を勝ち抜くインフラエンジニアの究極の生存戦略です。


総まとめ:データサイエンティストを救うのはLinuxエンジニアである

第3回の講座、本当にお疲れ様でした!非常に熱量が高く、ディープな領域に踏み込みましたね。

今回は、AIを「研究室」から「現実世界のサービス」へと解放するための技術、MLOpsの根幹について学びました。

  1. 階層構造の理解: Kernel、NVIDIAドライバ、CUDA、コンテナという複雑なスタックのパズルを合わせる技術。
  2. OSチューニング: OOM Killerの恐怖からAIモデルを守る、sysctl によるカーネルメモリ管理の極意。
  3. Nginxの壁: 何十分も考え込むAIの応答を途切らせないための、タイムアウトとプロキシ設定の最適化。

素晴らしいAIモデルが完成しても、それを動かすインフラが不安定であれば、そのAIは誰の役にも立ちません。データサイエンティストが創り出した「知能」に、安定して稼働する「強靭な肉体(Ubuntu 26.04サーバー)」を与えるのは、他でもないLinuxエンジニアである「あなた」なのです。

次回、第4回「Rust化するLinux Kernel:メモリ安全性とポスト量子セキュリティへの対応」では、なぜ世界中の巨大企業がLinuxの心臓部(カーネル)をC言語からRust言語へと書き換えているのか、その歴史的なパラダイムシフトと、我々エンジニアに求められる新たなセキュリティの常識について解説します。お楽しみに!

▼ AIインフラを実践環境でぶん回そう ▼

NVIDIA GPU搭載インスタンスも選べる
「AI開発に強い高性能クラウドVPS」

おすすめVPS比較ランキングを見る

MLOpsの知識で市場価値は天井知らず
「シニアSRE・AIインフラエンジニアへ転職」

ITエンジニア専門の転職支援に相談

コメント