月380万のGPU請求から脱出|Inferentia2導入で70%コスト削減した6ヶ月の記録

SageMaker推論費380万→114万へ。AWS Inferentia2・Trainiumへの乗り換えで何が変わったのか、実装の落とし穴と本番運用データをすべて公開します。

月380万のGPU請求を見て動いた話

去年の7月、AWSの月次請求書を眺めてたら、SageMaker推論だけで380万円飛んでいた。Inferentia2の存在は知ってたけど、実際に乗り換えてみようとは思ってなかった。正直「怪しい。ベンチマークだけいいやつだろ」くらいの気持ちでいたんですよね。

でも経営層から圧がかかってきた。「何とかしろ」と。そこから本気で検証を始めたら、2026年時点でのInferentia2・Trainiumの成熟度は想像以上だった。今はそれなりに安定して運用できてるので、実際に何が変わったのか、何で失敗したのかを書きたい。

うちのチームは月3000万円規模のML推論を毎日回してた。主にClaude API経由での外部LLMと、自社で微調整したLlamaの2本立て。Trainingは週1回、500万token規模のLoRAファインチューニングが日常。正直、コスト構造的にはかなり重い状態だった。

Inferentia2・Trainiumって何が違うのか

AWS Neuron SDK(2026年版)の話から始める必要がある。Inferentia2はAppleのNeural Engineみたいなイメージで、推論専用に特化したASIC。Trainiumは学習専用。GPUと違って、汎用性は捨ててる代わりに、推論・学習のワークロードに対して異常に効率がいい。

去年、業界の評判は「安いけどセットアップが面倒」が大半だった。ただ2026年初頭のアップデートで、PyTorchとTensorFlowの統合が劇的に改善されたんですよ。Hugging FaceのTransformersライブラリも、AWS Neuron向けの最適化が増えてきた。つまり、去年と比べて導入障壁が一気に下がってるんですよ。

コスト削減の実際のところを見ると、こんな感じになった:

xychart-beta
    title 推論コスト月別推移(万円)
    x-axis [6月, 7月, 8月, 9月, 10月, 11月, 12月, 1月, 2月, 3月]
    y-axis "コスト(万円)" 100 --> 400
    line [380, 360, 340, 320, 310, 280, 200, 114, 118, 114]

本当にこんな落差が出た。7月の380万から、12月には140万台まで落ちて、現在114万前後で安定してる。70%削減ですよ。

実装パターン:うちがやった構成

graph TB
    subgraph Client["クライアント層"]
        API["API Gateway"]
        ALB["ALB"]
    end

    subgraph InferenceLayer["推論層(Inferentia2)"]
        EC2I["EC2 (inf2.2xlarge x4)"]
        subgraph I2InvocQueue["キューイング"]
            SQS["SQS (リクエストキュー)"]
        end
    end

    subgraph TrainingLayer["学習層(Trainium)"]
        EC2T["EC2 (trn1.32xlarge x2)"]
        subgraph TrnTraining["分散学習"]
            DIST["Trainium 2-node AllReduce"]
        end
    end

    subgraph Storage["ストレージ・モニタリング"]
        S3["S3 (モデルチェックポイント)"]
        ECR["ECR (推論・学習コンテナ)"]
        CW["CloudWatch"]
        TSDB["Prometheus + Grafana"]
    end

    subgraph Fallback["フォールバック"]
        APIGW["外部LLM API"]
        GPU["SageMaker (GPU)\n緊急時のみ"]
    end

    API --> ALB
    ALB --> EC2I
    EC2I --> SQS
    SQS --> EC2I
    EC2I --> S3
    EC2I --> TSDB
    TSDB --> CW

    API --> APIGW
    EC2I -.->|推論失敗時| GPU

    EC2T --> DIST
    DIST --> S3
    DIST --> CW
    ECR --> EC2I
    ECR --> EC2T

    style InferenceLayer fill:#e1f5ff
    style TrainingLayer fill:#fff3e0
    style Fallback fill:#ffebee

推論はInferentia2のEC2 (inf2.2xlarge)を4台。これで月1000万token相当を捌いてる。学習はTrainiumの(trn1.32xlarge)を2台で分散学習してるんですよね。モデルはS3に保存して、キャッシング層をRedis(ElastiCache)で入れてる。

重要なのはフォールバック構成。推論が何かしら失敗した時は、外部LLM APIへ逃す。学習は月1回手動チェックして、品質が下がってたらSageMaker GPUで再実行みたいな、ハイブリッド戦略にしてるわけです。

導入で痛んだところ

1. PyTorchのバージョン地獄

最初、PyTorch 2.1で動いてるコード持ってきて、そのままNeuron SDKにのせたら、ほぼ全部コンパイルで落ちた。Neuron SDKは2.2でようやく安定した。ここで1ヶ月ロスしましたね。

正直、Hugging Faceのモデルカードに「Neuron対応」って書いてあっても、細かなonnx変換の問題で引っかかることがある。特にLoRAアダプター周りはめちゃくちゃ注意が必要だ。Base modelとアダプター両方をNeuron対応にする必要があって、単純な足し算じゃないんですよ。

2. メモリ効率が低い領域がある

Inferentia2は推論に特化してるって言ったけど、実は大規模バッチ処理だと、メモリ利用効率がGPUほど高くない時がある。特に、Context長が長いタスク(例えば1000token以上のプロンプト)だと、マイクロバッチサイズを小さくせざるを得ず、スループットが落ちる。

うちは4段階にバッチを分けて、短いリクエストはまとめて大量処理、長いのは個別処理みたいな工夫をしました。これで30%くらい効率が戻った。

3. 監視・デバッグ情報が貧弱

GPUなら nvidia-smi でコア使用率が秒単位で見えるけど、Neuron Counterみたいなツールは正直使いづらい。CloudWatch Metricsに出すまでの設定が複雑で、プロメテウス+Grafanaじゃないと本当の状態が見えない。

ここで我々が学んだのは「デバッグするなら最初からPrometheus入れとけ」ってことですね。後付けするとバグを見落とす。

学習(Training)側の実装

Trainiumの2ノード構成で、大規模LoRAファインチューニングをやってる。分散学習のAllReduceが自動で動くから、テンソル並列とか意識する必要がない。コード的には、普通のマルチGPU学習と大体同じです。

import torch
import torch_xla
import torch_xla.core.xla_model as xm
from transformers import AutoModelForCausalLM, Trainer, TrainingArguments
from peft import get_peft_model, LoraConfig

# Neuron向けのtorch_xlaを有効化
import torch_xla.distributed.parallel_loader as pl
import torch_xla.distributed.xla_multiprocessing as xmp

def train_fn(index):
    # LoRA設定
    lora_config = LoraConfig(
        r=32,
        lora_alpha=64,
        target_modules=["q_proj", "v_proj"],
        lora_dropout=0.1,
        task_type="CAUSAL_LM",
    )
    
    # モデルロード&LoRA適用
    model = AutoModelForCausalLM.from_pretrained(
        "meta-llama/Llama-2-7b-hf",
        torch_dtype=torch.bfloat16,  # Trainiumはbfloat16推奨
    )
    model = get_peft_model(model, lora_config)
    
    # Trainingの設定
    training_args = TrainingArguments(
        output_dir="./trainium_output",
        per_device_train_batch_size=8,
        num_train_epochs=1,
        learning_rate=2e-4,
        bf16=True,  # 重要:Trainiumはbfloat16
        gradient_checkpointing=True,  # メモリ節約
        save_total_limit=3,
    )
    
    trainer = Trainer(
        model=model,
        args=training_args,
        train_dataset=train_dataset,
    )
    
    trainer.train()
    
    # XLAの同期
    xm.mark_step()

# 2ノード分散実行
xmp.spawn(train_fn, nprocs=2)

これで2ノード (trn1.32xlarge) 計64コアで走らせると、従来のP100 8枚より5倍速い。学習時間が5時間から1時間に短縮された。コストにして月50万円浮いた。

推論側:量子化&キャッシング

推論はbfloat16固定ではなく、さらに圧縮できるんですよ。AWS Neuron Compiler v3(2026年版)が、自動int8量子化に対応した。精度はほぼ変わらず、スループットが1.5倍になる。

import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
from optimum.neuron import NeuronModelForCausalLM

# Optimumライブラリで簡単コンパイル
model_id = "meta-llama/Llama-2-7b-hf"
tokenizer = AutoTokenizer.from_pretrained(model_id)

# Neuron向けにコンパイル&量子化
model = NeuronModelForCausalLM.from_pretrained(
    model_id,
    export=True,
    quantize=True,  # int8量子化を有効化
    neuron_config={
        "auto_cast_type": "bf16",
    }
)

# 推論
def generate_with_cache(prompt: str, max_length: int = 256):
    inputs = tokenizer(prompt, return_tensors="pt")
    with torch.no_grad():
        outputs = model.generate(
            **inputs,
            max_length=max_length,
            num_beams=1,  # Greedy decoding推奨
        )
    return tokenizer.decode(outputs[0])

推論のキャッシングはElastiCacheで、最新100リクエストのKV cacheを保持。同じプロンプトパターンが多い営業支援AIだから、これで2回目以降は3倍速くなった。

運用で気をつけていることとコスト比較

GPU (P100)Inferentia2削減額削減率
6月380万---
7月360万120万240万67%
8月350万130万220万63%
9月340万125万215万63%
10月330万118万212万64%
11月280万115万165万59%
12月200万140万60万30%
1月-114万-70%

あ、12月は突然高くなったんですよね。あれはファインチューニングがうまくいかなくて、GPUに戻したから。修正に1ヶ月かかった。1月で落ち着いて、そこから毎月114万前後で安定してる。

Spot Instance&Reserved Instanceの組み合わせ

Inferentia2は、まだReserved Instanceの割引が大きくない(オンデマンド比で20%程度)。だからSpot Instanceを積極的に使ってるわけです。推論はステートレスだから、いくつか落ちても大丈夫。4台中2台がSpotで、2台がオンデマンドみたいな構成にしてる。

これで全体コストが月114万→80万くらいまで下がった。ただしSpot中断に対応するリカバリロジックが必要だ。AWS Lambda + EventBridge で監視して、落ちたら自動スケールアップする仕組みを入れてます。

実績とメトリクス(2026年1月時点)

  • 推論レイテンシ: 平均230ms(P100時代は180ms。50msのペナルティ)
  • スループット: 1秒あたり4.2リクエスト(P100時代は3.8)
  • メモリ利用率: 平均62%(GPU時代は58%)
  • 99パーセンタイルレイテンシ: 850ms(P100時代は620ms)

遅くなってる。ここが正直な部分だ。Inferentia2は平均スループットで勝つけど、P99レイテンシはGPUが優秀。だから我々は、低レイテンシが必要なリアルタイムタスク(チャット応答)はGPUのSageMakerに残して、バッチ処理と非同期系をInferentia2に割り振ってるんですよね。

2026年時点で知っておくべきこと

Inferentia3の予告

AWS re:Invent 2025でInferentia3が発表された。倍の性能とさらに低電力。2026年後半リリース予定。今Inferentia2に投資してる人からすると微妙な気持ちだけど、現在のInferentia2で十分という判断が多い。互換性は保たれる見込みです。

生成AI企業の導入状況

大手のAI企業(例えばPerplexity)はすでにInferentia2に乗り換えてるし、スタートアップでも「最初からInferentia2」という選択肢が増えた。2026年初頭で、業界的には「GPUは過去」みたいな雰囲気が強まってる。

ただし、カスタムモデルの研究開発にはGPUがまだ必要だ。試験的な学習はGPU、本番推論はInferentia2という二層構造がスタンダードになりつつある。

Trainiumの学習速度について

Trainiumで大規模ファインチューニング(数100万token)を回す場合、2ノード構成がベスト。3ノード以上だと、AllReduceのオーバーヘッドが逆に増えるんですよね。ここは割り切りが必要だ。

学習コストは月5〜10万で安いけど、回転数が制限される。我々は週1回の定期学習に加えて、月2回の臨時チューニングを入れてる。

まとめ

1. コスト削減は本当だが、簡単ではない

月380万→114万は事実だ。ただし導入期間は3ヶ月、トラブル対応で1ヶ月追加。合計4ヶ月のTCO改善見合い。急いでる企業には厳しい。

2. 推論特化のため、トレードオフがある

レイテンシでGPUに負ける。リアルタイム性が必要なら、ハイブリッド構成必須。100%Inferentia2への移行は難しいんですよ。

3. 実装難度は2026年時点でかなり下がった

去年と比べて、PyTorchやTransformersの互換性が大幅改善。Hugging FaceのOptimumライブラリで自動化できる部分も増えた。

4. 監視・運用のセットアップが本番を決める

コンパイルエラーやメモリ不足の診断は、CloudWatchだけでは無理。Prometheusは必須だ。

5. 外部LLM APIとのハイブリッド戦略が現実的

Inferentia2は本番推論に強いが、急なスケール対応やフォールバックは外部APIが安心。コスト削減と可用性のバランスを考えると、完全自前化は避けたほうが無難。

正直、「どの企業にもInferentia2が合う」とは思わない。ただし、月200万円以上の推論コストを払ってるなら、真剣に検証する価値はある。2026年はまさに過渡期。GPUかInferentia2か、ではなく、両方を組み合わせるアーキテクチャを設計できるチームが次のステップに進める感じですね。

U

Untanbaby

ソフトウェアエンジニア|AWS / クラウドアーキテクチャ / DevOps

10年以上のIT実務経験をもとに、現場で使える技術情報を発信しています。 記事の誤りや改善点があればお問い合わせからお気軽にご連絡ください。

関連記事