戻る
ホーム / ブログ / 技術とトレンド / AWS Lambdaで実現するクラウド環境LLMデプロイ入門

AWS Lambdaで実現するクラウド環境LLMデプロイ入門

2025/04/17
2025/04/16
AWS Lambdaで実現するクラウド環境LLMデプロイ入門

クラウド環境でLLM(大規模言語モデル)を動かしたいけれど、どうやって始めればいいのか分からない...

そんな疑問を持つエンジニアの方は多いのではないでしょうか?

OpenAIなどのマネージドサービスを使えば簡単にLLMを利用できますが、機密データの処理や特定の言語に特化した出力など、自前で運用したいケースも増えています。さらに、オープンソースのLLMは急速に進化し、商用モデルに匹敵する性能を発揮するようになってきました。

結論から申し上げると、AWS Lambdaを使えば、サーバーレスかつコスト効率よくLLMを実行できます。

実は、AWS LambdaのようなサーバーレスプラットフォームでLLMを動かすことは決して難しくありません。適切な設定と手順を踏めば、クラウド上で独自のLLMサービスを構築できるのです。

この記事では、RabilooのAIチームのリーダーがAWS LambdaでLLMをデプロイする方法を最初から最後まで、無駄なく実践的に解説します。

環境構築からコンテナ化、デプロイまでのステップを理解できます。

この記事でわかること
  • AWS LambdaでLLMを動かすメリットと制約

  • ローカル環境での開発とテスト方法

  • コンテナへのLLM実装手順

  • AWS Lambdaへのデプロイ方法

  • 実際のパフォーマンスとコスト分析

AWS LambdaでLLMを実行するメリットと制約

AWS Lambdaは、Amazon Web Services(AWS)が提供する「サーバーレスコンピューティングサービス」です。

つまり、サーバーを用意・管理しなくてもコードを実行できる仕組みです。

AWS LambdaでLLMを動かすという選択には、多くのメリットがあります。他のデプロイ方法と比較して、どのような利点があるのか詳しく見ていきましょう。

サーバーレスで管理が楽になる理由

従来のEC2インスタンスなどを使う方法では、サーバーの起動・停止・監視・更新・セキュリティパッチの適用などの管理タスクに時間を取られてしまいます。一方、AWS Lambdaではこれらの管理作業が不要になります。

Lambdaはサーバーレスサービスなので、基盤となるインフラの管理はAWSが担当します。これにより、エンジニアはサーバー管理ではなく、アプリケーション開発に集中できるようになります。特にLLMのような複雑なシステムを扱う場合、この利点は非常に大きいでしょう。

オートスケーリングの恩恵

AWS Lambdaの最大の強みの一つは、自動的にスケーリングする能力です。リクエスト数が増えても、手動でサーバーを増強したり、スケーリング設定を調整したりする必要がありません。

Lambdaは受信したリクエストに応じて自動的にインスタンスを増やし、トラフィックの負荷に対応します。これにより、急なアクセス増加にも柔軟に対応できるため、LLMサービスを公開する場合でも安心です。

コスト効率の良さ

AWS Lambdaは実行時間に応じた課金体系を採用しています。つまり、関数が実行されている時間とメモリ使用量に対してのみ課金されます。サービスがアイドル状態の時間帯にも料金が発生する従来のサーバーと比べると、大幅なコスト削減が期待できます。

たとえば、シンガポールリージョンでは0.0000001667ドル/ミリ秒という料金になり、後半で紹介する実験結果ではLlama-3.2-1Bモデルで1000リクエストあたり約4.33ドルのコストとなっています。アクセス頻度が低い場合や、開発・テスト環境では特に経済的な選択肢になるでしょう。

AWS Lambdaの制約とその対策

AWS Lambdaは優れたサービスですが、いくつかの制約があります。

最も重要な制約はリソースの制限です。AWS Lambdaは最大10GBのメモリと6 vCPUまでのコンピュートリソースしか使用できません。そのため、GPT-4のような巨大なモデルを動かすことはできません。しかし、GPT-2、Llama-3.2-1B、Queen-2.5-1.5Bやミストラル-7B(量子化を使用)のような小規模モデルなら十分動作可能です。

もう一つの制約はコールドスタート問題です。一定時間使用されていないLambda関数は停止状態になり、次回リクエスト時に再起動する必要があります。これにより、最初のリクエストは処理に時間がかかることがあります。LLMは比較的大きなモデルを読み込むため、初回起動時間が長くなりがちです。

これらの制約に対しては、以下の対策が有効です:
  1. 量子化されたモデルの使用: モデルサイズを小さくし、性能を維持する技術

  2. 適切なメモリ設定: 十分なメモリを割り当てることでパフォーマンスを向上

  3. ウォームスタートの維持: 定期的なダミーリクエストで関数をウォームに保つ

こうした制約を理解した上で適切な対策を講じれば、AWS Lambdaは多くの実用的なLLMユースケースに対応できる強力なプラットフォームになります。

ポイントは、使用するモデルのサイズと必要なレスポンス時間に合わせて、適切な設定を行うことです。

AWS LambdaでLLMを動かすための開発環境の準備

AWS LambdaでLLMを動かすには、適切な開発環境の準備が不可欠です。この章では、必要なツールやAWS設定、開発の前提条件を詳しく解説します。

必要な前提知識とツール

まず、以下のツールと知識が必要です:

  1. AWSアカウント: すべての作業の基盤となるAWSアカウントが必要です。まだ持っていない場合は、AWSの公式サイトで無料で作成できます。

  2. AWS CLI: コマンドラインからAWSリソースを操作するためのツールです。インストールされているか確認するには、ターミナルでaws --versionを実行してください。バージョン情報が表示されればインストール済みです。

  3. Docker: LLMをコンテナ化するために必須です。Docker Desktopをインストールし、docker --versionコマンドで動作確認をしておきましょう。

  4. コードエディタ: Visual Studio CodeやPyCharmなど、好みのコードエディタを用意します。

  5. Python: バージョン3.9以上をインストールしておきましょう。LLMのコードはPythonで記述します。

以上のツールに加えて、AWSの主要サービス(Lambda、ECR、IAM)についての基本的な知識と、Dockerの基本概念を理解しておくと作業がスムーズに進みます。すべてを深く理解している必要はありませんが、簡単な操作ができるレベルであれば十分です。

AWS関連設定のセットアップ

AWSリソースにアクセスするための適切な権限設定が必要です。以下の手順で設定しましょう:

  1. AWS CLIの設定: ターミナルでaws configureコマンドを実行し、アクセスキーID、シークレットアクセスキー、デフォルトリージョン、出力形式を設定します。

    aws configure
    
    

    画面の指示に従って、認証情報を入力してください。リージョンは使用したいAWSリージョン(例:ap-northeast-1 for 東京)を指定します。

  2. IAMポリシーと権限: AWコンソールでIAMユーザーに必要な権限があることを確認します。最低でも以下の権限が必要です:

    • ECRリポジトリの作成・プッシュ権限

    • Lambda関数の作成・呼び出し権限

    • IAMロールの作成・管理権限

この記事の後半では、必要なIAMロールを自動的に作成するコマンドを紹介しますが、AWS管理ポリシーである「AWSLambdaBasicExecutionRole」を使用します。これにより、Lambda関数がCloudWatchにログを書き込むための最小限の権限が付与されます。

Dockerの準備

Dockerはコンテナ技術の中心的な存在です。AWSではECR(Elastic Container Registry)を使用してDockerイメージを保存し、そこからLambda関数を作成します。以下の手順を実行して、Dockerが正しく設定されていることを確認しましょう:

  1. Dockerデーモンの起動: Docker Desktopを起動するか、Linux環境ではsystemctl start dockerなどのコマンドでDockerデーモンを起動します。

  2. 動作確認: 以下のコマンドを実行して、Dockerが正常に動作していることを確認します。

    docker run hello-world
    
    

    「Hello from Docker!」というメッセージが表示されれば、Dockerは正常に動作しています。

  3. ディスク容量の確認: LLMのイメージはかなり大きくなる可能性があるため、十分なディスク容量(少なくとも10GB以上)があることを確認しておきましょう。

開発環境の準備が完了したら、実際のコード開発に進むことができます。次章では、ローカル環境でFastAPIを使ってLambda関数を作成し、Dockerコンテナ内で動作させる方法を解説します。

適切な開発環境を整えることで、後の作業がスムーズに進みます。特にAWS CLIの認証設定は、多くのエラーの原因となるポイントなので、正しく設定されていることを必ず確認しておきましょう。

LambdaとFastAPIでローカル開発環境を構築

Lambda関数をデプロイする前に、まずはローカル環境で動作確認を行うことが重要です。ここでは、FastAPIを使ったAPIの構築からDockerコンテナの作成、そしてローカルテストまでの流れを解説します。

FastAPIでAPIを作成する

FastAPIは高速で使いやすいPythonのWebフレームワークです。AWSのLambda関数としてAPIを公開するために、まずはFastAPIを使ってシンプルなAPIを構築します。

まず、プロジェクトディレクトリを作成し、最小限のFastAPIアプリケーションを実装しましょう。以下のようなファイル構成で始めます:

  1. app.py: メインのアプリケーションコード

  2. requirements.txt: 必要なPythonパッケージの一覧

app.pyには以下のコードを記述します:

from fastapi import FastAPI
from mangum import Mangum

app = FastAPI()

@app.post("/chat")
async def root(data: dict):
   return f"Hello {data['input_text']}"

handler = Mangum(app)

ここでのポイントは以下の通りです:

  • FastAPIを使って簡単なAPIエンドポイント(/chat)を作成

  • POSTリクエストを受け取り、JSONデータを処理

  • Mangumを使ってFastAPIアプリケーションをAWS Lambda用のハンドラに変換

次に、requirements.txtに必要なパッケージを記述します:

fastapi
mangum

この段階では、まだLLMは統合せず、シンプルなレスポンスを返すAPIを作成しています。これにより、基本的なAPI構造とLambda関数の連携が正しく機能していることを確認できます。

Dockerコンテナの構築

次に、作成したAPIをDockerコンテナ化します。これには、AWSが提供する公式のLambda用Pythonイメージを使用します。

以下の内容でDockerfileを作成します:

FROM public.ecr.aws/lambda/python:3.12

# Copy requirements.txt
COPY requirements.txt ${LAMBDA_TASK_ROOT}

# Install the specified packages
RUN pip install -r requirements.txt

# Copy function code
COPY app.py ${LAMBDA_TASK_ROOT}

# Set the CMD to your handler
CMD [ "app.handler" ]

このDockerfileでは、以下のことを行っています:

  1. AWSが提供する公式のLambda用Pythonイメージをベースに使用

  2. 必要なパッケージをインストール

  3. アプリケーションコードをコンテナ内にコピー

  4. コンテナ起動時にLambdaハンドラを指定

これで、ローカルでLambda関数の動作環境を再現するコンテナの準備が完了しました。

ローカルでのテスト実行

Dockerfileを作成したら、イメージをビルドしてコンテナを実行しましょう。以下のコマンドを実行します:

docker build -t llm-lambda:latest .
docker run -it -p 8080:8080 llm-lambda:latest

これにより、ローカルの8080ポートでLambda関数が実行されます。しかし、通常のHTTPリクエストとは異なり、Lambda関数はAWS特有の方法で呼び出す必要があります。

別のターミナルウィンドウを開き、以下のようなcurlコマンドでAPIをテストします:

curl -X POST "<http://localhost:8080/2015-03-31/functions/function/invocations>" \\
  -H "Content-Type: application/json" \\
  -d '{
    "resource": "/chat",
    "path": "/chat",
    "httpMethod": "POST",
    "requestContext": {
      "resourcePath": "/chat",
      "httpMethod": "POST"
    },
    "body": "{\\"input_text\\": \\"How to learn LLM.\\"}"
  }'

正常に動作すれば、次のような応答が返ってきます:

Hello How to learn LLM.

この時点でのテストは、Lambdaハンドラがリクエストを正しく処理し、FastAPIルーティングが機能していることを確認するためのものです。まだLLMは組み込まれていませんが、基本的なインフラストラクチャが正しく設定されていることが確認できました。

これで基本的なLambda関数の設定は完了です。次のステップでは、このコンテナにLLMを統合し、実際の言語モデルを呼び出せるようにします。

ローカルでの開発とテストを行うことで、AWSへのデプロイ前に問題を早期に発見し、修正することができます。これにより、デプロイプロセスがスムーズになり、本番環境でのトラブルを防ぐことができるのです。

DockerコンテナでLLMを実行する技術ポイント

ここからは、実際にLLMをDockerコンテナ内で実行し、AWS Lambdaの環境に適応させるための技術的なポイントを解説します。Lambda環境の制約を考慮した上で、最適なモデル選択と設定方法を見ていきましょう。

最適なLLMモデルの選択

AWS Lambdaは資源に制約があるため、全てのLLMを動かせるわけではありません。適切なモデルを選ぶことが成功の鍵となります。

Lambda環境で動かすLLMを選ぶ際のポイントは以下の通りです:

  1. モデルサイズ: 小規模から中規模のモデル(~3B程度のパラメータ数)が適しています

  2. CPU最適化: GPUがないため、CPUで効率的に動作するモデルを選ぶ

  3. メモリ使用量: 10GB以内に収まるモデルであること

  4. タスク適合性: 特定のタスクに適したモデルを選ぶことでサイズを抑えながら高性能を実現

この記事では例としてLlama-3.2-1B-Instructモデルを使用しています。これは約10億パラメータのモデルで、比較的軽量ながら十分な性能を発揮します。他にもQueen-2.5-1.5BMistral-7B(量子化適用時)などが候補となるでしょう。

量子化モデルとGGUFフォーマットの利点

AWS Lambdaのような制約のある環境では、モデルの最適化が重要です。ここで役立つのが「量子化」と「GGUFフォーマット」です。

  • 量子化(Quantization)*とは、モデルの重みを低精度の数値形式に変換することで、モデルサイズを小さくし、推論速度を向上させる技術です。例えば、32ビット浮動小数点(FP32)から16ビット浮動小数点(FP16)や8ビット整数(INT8)に変換することで、精度をある程度犠牲にしながらもサイズとパフォーマンスを大幅に改善できます。

GGUFフォーマットは、llama.cppなどのCPU最適化ライブラリで使用されるモデル形式で、以下の利点があります:

  • CPU上で効率的に動作するように最適化されている

  • 量子化のサポートが組み込まれている

  • メモリ使用量が少ない

  • ローディング時間が短い

これらの特性により、CPU環境しか使えないAWS Lambdaで効率的にLLMを動かすことが可能になります。

コンテナでLLMを動かすための設定

LLMをLambdaコンテナで動かすには、ベースのDockerfileを拡張する必要があります。llama-cpp-pythonライブラリをインストールし、必要なモデルファイルをコンテナに含める必要があります。

まず、モデルファイルをダウンロードします:

wget <https://huggingface.co/unsloth/Llama-3.2-1B-Instruct-GGUF/resolve/main/Llama-3.2-1B-Instruct-F16.gguf>

次に、requirements.txtを更新して必要なライブラリを追加します:

llama-cpp-python
fastapi
mangum

そして、マルチステージビルドを使用した最適化されたDockerfileを作成します:

# Stage 1: Build environment using a Python base image
FROM python:3.12 as builder

# Install build tools
RUN apt-get update && apt-get install -y gcc g++ cmake zip

# Copy requirements.txt and install packages with appropriate CMAKE_ARGS
COPY requirements.txt .
RUN CMAKE_ARGS="-DLLAMA_BLAS=ON -DLLAMA_BLAS_VENDOR=OpenBLAS" pip install --upgrade pip && pip install -r requirements.txt

# Stage 2: Final image using AWS Lambda Python image
FROM public.ecr.aws/lambda/python:3.12

# Install OpenMP library
RUN  dnf -y install libgomp

# Copy installed packages from builder stage
COPY --from=builder /usr/local/lib/python3.12/site-packages/ /var/lang/lib/python3.12/site-packages/

# Copy lambda function code
COPY Llama-3.2-1B-Instruct-f16.gguf ${LAMBDA_TASK_ROOT}
COPY app.py ${LAMBDA_TASK_ROOT}

CMD [ "app.handler" ]

このDockerfileには重要なポイントがいくつかあります:

  1. マルチステージビルド: ビルド環境と実行環境を分離し、最終イメージのサイズを小さくする

  2. ビルドフラグ: DLLAMA_BLAS=ON -DLLAMA_BLAS_VENDOR=OpenBLASフラグを使用して、マルチスレッド最適化を有効にする

  3. ライブラリ追加: libgompをインストールして並列処理をサポート

  4. モデルファイルのコピー: ダウンロードしたモデルファイルをコンテナにコピー

これらの設定により、限られたリソースでLLMを効率的に実行できる環境が構築されます。

Lambda向けコードの最適化

最後に、app.pyを更新して実際にLLMを呼び出せるようにします:

import json

from fastapi import FastAPI
from mangum import Mangum
from llama_cpp import Llama

# Load the LLM, outside the handler so it persists between runs
llm = Llama(
   model_path="Llama-3.2-1B-Instruct-f16.gguf", # change if different model
   n_ctx=2048, # context length
   n_threads=6,  # maximum in AWS Lambda
)

app = FastAPI()

@app.post("/chat")
async def root(data: dict):
   output = llm(
       f"Instruct: {data['input_text']}\\nOutput:",
       max_tokens=512,
       echo=True,
   )
   return {
       "statusCode": 200,
       "body": json.dumps(output)
   }

handler = Mangum(app)

このコードのポイントは:

  1. モデルの初期化: ハンドラー関数の外でモデルを初期化することで、コールドスタート後のリクエストでモデルの再読み込みを避ける

  2. スレッド数の最適化: n_threads=6でLambdaの最大vCPU数を活用

  3. コンテキスト長の設定: n_ctx=2048で適切なコンテキスト長を設定し、メモリ使用量とレスポンス生成能力のバランスを取る

  4. 推論パラメータの調整: max_tokens=512で生成するトークン数を制限し、タイムアウトを防ぐ

これらの最適化により、Lambda環境でLLMを効率的に実行できるようになります。

モデル、Dockerの構成、コードの最適化が完了したら、再度ローカル環境でビルドとテストを行い、動作を確認しましょう:

docker build -f Dockerfile -t llm-lambda:latest .
docker run -it -p 8080:8080 llm-lambda:latest

そして、前章と同様のcurlコマンドでテストします。今回は実際のLLMからの応答が返ってくるはずです。

コンテナでのLLM実行には、リソース制約とのバランスを取りながら最大のパフォーマンスを引き出すための様々な工夫が必要です。モデルサイズ、量子化レベル、スレッド数などのパラメータを調整することで、Lambda環境で効率的に動作するLLMサービスを構築できます。

AWS Lambdaへのデプロイプロセス

ローカル環境でLLMを動かすコンテナが完成したら、いよいよAWS Lambdaへのデプロイを行います。このプロセスは、ECRリポジトリの作成、コンテナイメージのプッシュ、Lambda関数の設定と実行という流れで進めていきます。

ECRリポジトリの作成

AWS LambdaにDockerコンテナをデプロイするには、まずAmazon Elastic Container Registry(ECR)にリポジトリを作成する必要があります。ECRは、Dockerイメージを保存・管理するためのフルマネージドコンテナレジストリサービスです。

まず、使用するAWSリージョンを環境変数に設定しておきましょう。この例ではシンガポールリージョン(ap-southeast-1)を使用しますが、お好みのリージョンに変更できます。

export AWS_REGION=ap-southeast-1

次に、ECRリポジトリを作成します:

aws ecr create-repository --repository-name llm-lambda --region $AWS_REGION

成功すると、リポジトリの詳細情報がJSON形式で返されます。リポジトリURIを確認しておきましょう:

aws ecr describe-repositories --repository-names llm-lambda --region $AWS_REGION

コンテナイメージのプッシュ

作成したECRリポジトリにコンテナイメージをプッシュします。まず、AWSアカウントIDを取得し、環境変数に設定します:

export AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)

次に、DockerをAWS ECRに認証します:

aws ecr get-login-password --region $AWS_REGION | docker login --username AWS --password-stdin $AWS_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com

コンテナイメージにECRリポジトリのタグを付けます:

docker tag llm-lambda:latest $AWS_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com/llm-lambda:latest

最後に、イメージをECRにプッシュします:

docker push $AWS_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com/llm-lambda:latest

イメージのサイズによっては、プッシュに数分かかる場合があります。モデルファイルが含まれているため、通常のコンテナよりも大きくなります。

Lambda関数の作成と設定

ECRにイメージがプッシュされたら、Lambda関数を作成します。まず、Lambda関数が使用するIAMロールを設定する必要があります。

IAMロールを作成するには、信頼ポリシーを定義したJSONファイルが必要です。以下の内容でtrust-policy.jsonを作成します:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "lambda.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

次に、環境変数を設定し、IAMロールを作成します:

export LAMBDA_ROLE_NAME="llm-lambda-role"
export IAM_POLICY_FILE="trust-policy.json"

aws iam create-role --role-name $LAMBDA_ROLE_NAME --assume-role-policy-document file://$IAM_POLICY_FILE
aws iam attach-role-policy --role-name $LAMBDA_ROLE_NAME --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole

作成したIAMロールのARNを取得します:

export LAMBDA_ROLE_ARN=$(aws iam get-role --role-name $LAMBDA_ROLE_NAME --query 'Role.Arn' --output text)

これで、Lambda関数を作成できます:

aws lambda create-function \\
    --function-name llm-lambda \\
    --role $LAMBDA_ROLE_ARN \\
    --timeout 300 \\
    --memory-size 10240 \\
    --package-type Image \\
    --code ImageUri=$AWS_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com/llm-lambda:latest

注目すべきパラメータは以下の通りです:

  • -timeout 300: 実行タイムアウトを5分(300秒)に設定

  • -memory-size 10240: メモリ割り当てを10GB(最大値)に設定

  • -package-type Image: コンテナイメージを使用するよう指定

関数URLの設定とテスト

Lambda関数を直接HTTPリクエストで呼び出せるように、関数URLを設定します:

aws lambda create-function-url-config \\
    --function-name llm-lambda \\
    --auth-type "NONE" --region $AWS_REGION

この設定では認証なし(auth-type "NONE")で呼び出し可能な関数URLを作成しています。本番環境では、適切な認証を設定することをお勧めします。

次に、関数URLへのパブリックアクセスを許可するための権限を追加します:

aws lambda add-permission \\
    --function-name llm-lambda \\
    --region $AWS_REGION \\
    --statement-id "FunctionURLAllowPublicAccess" \\
    --action "lambda:InvokeFunctionUrl" \\
    --principal "*" \\
    --function-url-auth-type "NONE"

最後に、関数URLを取得して表示します:

export FUNCTION_URL=$(aws lambda get-function-url-config --region $AWS_REGION --function-name llm-lambda --query 'FunctionUrl' --output text)

echo "Lambda Function URL: $FUNCTION_URL"

これで、Lambda関数をHTTPリクエストで呼び出す準備が整いました。curlコマンドを使ってテストしてみましょう:

curl -X POST "$FUNCTION_URL" \\
  -H "Content-Type: application/json" \\
  -d '{
    "resource": "/chat",
    "path": "/chat",
    "httpMethod": "POST",
    "requestContext": {
      "resourcePath": "/chat",
      "httpMethod": "POST"
    },
    "body": "{\\"input_text\\": \\"How to learn LLM.\\"}"
  }'

正常に動作すれば、LLMからの応答がJSON形式で返ってきます。初回呼び出し時はモデルのロードに時間がかかるため、タイムアウトしないよう注意してください。

AWSマネジメントコンソールからもLambda関数をテストできます。コンソールにログインし、Lambda関数のページに移動してテスト機能を使用しましょう。

デプロイのプロセスは以上です。これで、AWS Lambda上でLLMを実行するサービスが完成しました。無料枠内で実験する場合は、使用後にリソースを削除することを忘れないようにしましょう。

次章では、実際にデプロイしたLLMのパフォーマンスとコストについて分析していきます。

パフォーマンスとコスト分析

AWS Lambdaを使ったLLMデプロイのパフォーマンスとコストを理解することは、実運用にあたって重要な要素です。この章では、異なるモデルのパフォーマンス比較や実行コストの分析を行います。

異なるモデルのパフォーマンス比較

AWS Lambdaの設定として「6コアのマルチスレッド、10GBのRAM、5分のタイムアウト」という環境で、いくつかの異なるモデルをベンチマークしました。以下の表はその結果をまとめたものです:

モデル

合計トークン数

実行時間(秒)

トークン生成速度(token/s)

最大メモリ使用量(MB)

Llama-3.2-1B-Instruct

448

26

17.23

713

DeepSeek-R1-Distill-Qwen-1.5B

524

18.5

28.32

1158

Qwen2.5-Coder-3B-Instruct

212

13

16.3

1922

この結果から、いくつかの重要な傾向が見えてきます:

  1. モデルサイズとメモリ使用量: モデルのパラメータ数が大きくなるほど、メモリ使用量が増加します。Qwen2.5-Coder-3Bは最もメモリを消費しますが、Lambdaの上限である10GBには余裕があります。

  2. トークン生成速度: DeepSeek-R1-Distill-Qwen-1.5Bが最も高速で、約28トークン/秒の速度を記録しています。これは、モデルアーキテクチャの効率性の違いを示しています。

  3. 実行時間: 合計トークン数と実行時間は必ずしも比例せず、モデルの効率性が大きく影響します。Qwen2.5-Coder-3Bは少ないトークン数で最も短い実行時間となっています。

モデル選択の際には、これらの指標を考慮して、自分のユースケースに最適なものを選ぶことが重要です。例えば、レスポンス速度が重要な場合はDeepSeek-R1-Distill-Qwen-1.5Bが良い選択肢となるでしょう。

メモリ使用量と実行時間の関係

AWS Lambdaでは、割り当てるメモリ量によってCPUパワーも比例して増加します。これはLLMの推論速度に直接影響します。最適なメモリ設定を見つけるために、異なるメモリ設定でのパフォーマンスを比較することが重要です。

一般的なガイドラインとして:

  • メモリ設定が低すぎると、モデルがロードできなかったり、実行が非常に遅くなったりする

  • メモリ設定が高すぎると、使用していないリソースに対しても課金されるためコスト効率が悪化する

今回のベンチマークでは10GBのメモリを設定していますが、これはLambdaの最大値です。一部のモデルでは、もう少し低いメモリ設定でも十分動作する可能性があります。例えば、Llama-3.2-1B-Instructは最大メモリ使用量が713MBなので、理論的には1〜2GBのメモリ設定でも動作するはずです。

ただし、メモリ設定を下げるとCPUパワーも減少するため、推論速度が遅くなる点には注意が必要です。

リクエストあたりのコスト計算

AWS Lambdaのコストは、実行時間とメモリ使用量に基づいて計算されます。シンガポールリージョン(ap-southeast-1)の料金は約0.0000001667ドル/ミリ秒です。

これに基づいて各モデルのリクエストあたりのコストを計算すると:

モデル

実行時間(秒)

コスト($/1000リクエスト)

Llama-3.2-1B-Instruct

26

4.33

DeepSeek-R1-Distill-Qwen-1.5B

18.5

3.1

Qwen2.5-Coder-3B-Instruct

13

2.17

Qwen2.5-Coder-3B-Instructが最も低コストですが、これは主に生成されたトークン数が少ないためです。トークンあたりのコストを計算すると、実は異なる結果になる可能性があります。

また、コールドスタートの影響も考慮する必要があります。頻繁にアクセスされないLambda関数では、初回起動時間が長くなり、コストが増加します。これを軽減するために、定期的な「ウォームアップ」リクエストを送信する戦略も検討できます。

最適な設定の選び方

実運用環境での最適な設定を選ぶには、以下の要素のバランスを考える必要があります:

  1. レスポンス時間の要件: ユーザー体験に直接影響するため、許容できる最大レスポンス時間を決定する

  2. 精度とクオリティ: より大きなモデルは一般的に精度が高いが、レスポンス時間とコストのトレードオフになる

  3. 予算: 予測される月間リクエスト数に基づいて、サステイナブルな予算内に収まるモデルと設定を選択

  4. トラフィックパターン: アクセスが集中する時間帯や、アイドル時間が長い場合など、トラフィックパターンに合わせた最適化

最適な設定を見つけるプロセスは反復的です。まずは小規模なテストから始め、実際の使用パターンでパフォーマンスとコストを測定し、必要に応じて調整していくことをお勧めします。

例えば、開発・テスト環境では低コストのLlama-3.2-1B-Instructを使用し、本番環境ではより精度の高いモデルを使用するといった使い分けも効果的です。

AWS Lambdaを使ったLLMの運用では、これらのパフォーマンスとコスト指標を継続的にモニタリングし、ビジネスニーズとのバランスを取りながら最適化していくことが成功の鍵となります。適切に設計・最適化されたLLMサービスは、コスト効率と高いパフォーマンスの両方を達成できるのです。

今後のステップと応用

AWS Lambdaを使ったLLMデプロイの基本は理解できたと思いますが、ここからさらに発展させるための方向性について考えてみましょう。実験を通じて得られた知見を活かし、より実用的なシステムを構築するためのヒントを紹介します。

より大きなモデルへの挑戦

今回は比較的小さなモデル(1B~3Bパラメータ)を使用しましたが、より高性能なモデルにも挑戦してみる価値があります。

AWS Lambdaの制約内でより大きなモデルを動かすためのアプローチとしては:

  1. より高度な量子化技術の活用: INT4やINT8量子化を適用することで、7Bパラメータクラスのモデルも実行可能になります。例えば、Mistral-7BはINT4量子化を適用すると約2GB程度まで縮小でき、Lambda環境でも十分動作します。

  2. スパーシティ技術の活用: モデルのプルーニング(不要なパラメータの削除)や、スパーステンソル計算を利用することで、モデルサイズを削減しながら性能を維持できます。

  3. モデルの分散: 大きなモデルを複数のLambda関数に分割し、API Gateway経由で連携させる高度なアーキテクチャも可能です。これにより、単一のLambda関数では実行できないサイズのモデルも動かせるようになります。

より大きなモデルへの挑戦は、パフォーマンスとコストのバランスを考慮しながら段階的に進めることをお勧めします。まずは少しサイズの大きいモデルで実験し、その結果を評価してから次のステップに進むとよいでしょう。

異なる設定の最適化

AWS Lambda環境でLLMのパフォーマンスを最大化するためには、さまざまな設定パラメータを最適化する必要があります。試してみるべき設定としては:

  1. メモリサイズの最適化: 前章で説明した通り、メモリ設定はCPUパワーにも影響します。同じモデルでも、異なるメモリ設定でベンチマークを行い、コストパフォーマンスの最適なバランスを見つけましょう。

  2. スレッド数の調整: n_threadsパラメータの値によって、モデルの推論速度が大きく変わります。Lambdaの最大値である6スレッドが常に最適とは限らないため、異なる値で実験してみましょう。

  3. バッチ処理の導入: 複数のリクエストをバッチ処理することで、効率が向上する場合があります。これには、APIの設計変更が必要になります。

  4. プロンプトエンジニアリング: モデルごとに最適なプロンプト形式が異なります。効率的な出力を得るためにプロンプトを最適化しましょう。

これらの設定は相互に関連しており、組み合わせによって最適な結果が得られます。系統的な実験と記録が重要です。

異なるクラウドプラットフォームでの実装

AWS Lambda以外にも、サーバーレスプラットフォームは数多く存在します。異なるプラットフォームでも同様のアプローチを試すことで、それぞれの特徴や利点を比較できます:

  1. Google Cloud Functions: Google Cloudのサーバーレスプラットフォームで、Python 3.11をサポートし、メモリは16GBまで設定可能です。

  2. Azure Functions: Microsoftのサーバーレスサービスで、コンテナサポートがあり、最大14GBのメモリを割り当てられます。

  3. Cloudflare Workers: エッジでの実行に特化したサーバーレスプラットフォームで、WebAssemblyを活用したLLM実行も可能です。

異なるプラットフォームを比較する際は、以下の要素を考慮すると良いでしょう:

  • コールドスタート時間

  • 最大メモリ/CPUリソース

  • 実行時間の制限

  • 料金体系

  • ネットワークレイテンシー(特にグローバル展開する場合)

プロダクション環境での運用のヒント

実験から実際のプロダクション環境への移行を考える際には、以下のポイントに注意しましょう:

  1. セキュリティ対策: 本記事のデモではシンプルにするため認証なしのAPIを作成しましたが、プロダクション環境では適切な認証・認可メカニズムを実装することが不可欠です。AWS Cognitoや API Gatewayの認証機能を活用しましょう。

  2. モニタリングと分析: CloudWatchを使ってパフォーマンスメトリクスを収集し、モデルの挙動を継続的に監視します。特に、レイテンシー、エラー率、コストなどの重要指標を追跡しましょう。

  3. 自動スケーリング戦略: Lambda関数は自動的にスケールしますが、同時実行数の上限設定や、予算超過を防ぐためのアラームの設定など、スケーリングに関連する設定も考慮する必要があります。

  4. モデル更新戦略: LLMの分野は急速に進化しており、定期的なモデル更新が必要になるでしょう。シームレスな更新を可能にするCI/CDパイプラインの構築を検討してください。

  5. コスト最適化: 長期的な運用では、予約キャパシティの活用やリソース使用量の定期的な見直しなど、コスト最適化が重要になります。AWS Cost Explorerを活用して、使用状況を定期的に分析しましょう。

コミュニティと最新動向への参加

LLMとサーバーレスコンピューティングの両分野は急速に発展しています。コミュニティに参加し、最新の動向をフォローすることで、新しいテクニックや最適化方法を学ぶことができます:

  1. Hugging Face: オープンソースのLLMコミュニティで、最新モデルや量子化技術などの情報が共有されています。

  2. GitHub: llama.cppなどのプロジェクトに注目し、最新の最適化テクニックをフォローしましょう。

  3. 専門フォーラム: AWS関連のフォーラムやRedditのr/MachineLearningなどで、実装のヒントや課題解決方法を共有・学習できます。

  4. 学術論文: 量子化やモデル最適化に関する最新の研究成果をフォローすることで、さらなる改善の可能性を見つけられるでしょう。

AWS Lambdaを使ったLLMデプロイは始まったばかりの分野であり、今後もさまざまな革新が期待されます。この記事で学んだ基本を土台に、独自のアプリケーションやサービスの開発に挑戦してみてください。オープンソースのLLMとクラウドの柔軟性を組み合わせることで、これまでにない革新的なAIサービスを実現できるはずです。

自分だけの特化型AIアシスタントや、データ分析ツール、社内ナレッジベースなど、アイデア次第で無限の可能性が広がっています。挑戦を続け、学びを共有していきましょう。

まとめ:AWS LambdaでLLMをすぐに実装

AWS Lambdaを使えば、サーバー管理不要でコスト効率の良いLLMサービスを構築できます。本記事では、環境準備からコンテナ化、デプロイまでの実践的なステップを解説しました。最適化されたモデル選択と設定により、リクエストあたり数ドルという経済的なコストでLLMを運用可能です。

独自のAIサービス構築にご興味があれば、Rabiloo(ラビロー)にお任せください。当社はAI開発・クラウドインテグレーションの専門家として、お客様のビジネスに最適なLLMソリューションを提供します。カスタムAIモデル構築からクラウドデプロイまで、ワンストップでサポート致します。

ビジネスの成長に貢献するAIソリューションについて、ぜひ一度ご相談ください。Rabilooの技術チームが、貴社のニーズに合わせた最適な提案をいたします。

Share


Dao Duy
RabilooのAI研究開発チームのリーダーとして、最適化や先端技術への深い関心を持ち、常により賢く、効率的なソリューションを生み出すための新たなアプローチを追求しています。
ブログを探す
オフショア開発とは?メリットやベンダー選びのポイントを簡単に解説!
オフショア開発とは?メリットやベンダー選びのポイントを簡単に解説!
Kakimoto Kota
2024/01/03
2025/04/03
令和時代のベトナムラボ型開発の魅力とは?良いパートナー選びのコツ
令和時代のベトナムラボ型開発の魅力とは?良いパートナー選びのコツ
Kakimoto Kota
2023/11/28
2025/01/08
RAGの精度向上に悩んだら、「Advanced RAG」で解決できます
RAGの精度向上に悩んだら、「Advanced RAG」で解決できます
Kakimoto Kota
2025/04/16
2025/04/16

お問い合わせ

未記入箇所がございます
未記入箇所がございます
未記入箇所がございます
未記入箇所がございます
ブログを探す
Tags
オフショア開発とは?メリットやベンダー選びのポイントを簡単に解説!
オフショア開発とは?メリットやベンダー選びのポイントを簡単に解説!
Kakimoto Kota
2024/01/03
2025/04/03
令和時代のベトナムラボ型開発の魅力とは?良いパートナー選びのコツ
令和時代のベトナムラボ型開発の魅力とは?良いパートナー選びのコツ
Kakimoto Kota
2023/11/28
2025/01/08
RAGの精度向上に悩んだら、「Advanced RAG」で解決できます
RAGの精度向上に悩んだら、「Advanced RAG」で解決できます
Kakimoto Kota
2025/04/16
2025/04/16

お問い合わせ

未記入箇所がございます
未記入箇所がございます
未記入箇所がございます
未記入箇所がございます