LiteLLMでAmazon Bedrockのアプリケーション推論プロファイルを使う
大阪オフィスの小倉です。
LiteLLMにAmazon Bedrockのアプリケーション推論プロファイルを設定してみました。
アプリケーション推論プロファイルにコスト配分タグを設定することで、LLMの利用料をAWSで追跡することができます。
MacOS上のDockerで環境を作って検証しています。検証に使用した環境は以下になります。
ソフトウェア | バージョン |
---|---|
LiteLLM | 1.72.6 |
PostgreSQL | 17 |
docker-composeファイル
services:
litellm:
image: ghcr.io/berriai/litellm-database:main-v1.72.6-stable
depends_on:
postgres:
condition: service_healthy
environment:
DATABASE_URL: postgresql://litellm-user:litellm-password@postgres:5432/litellm-d6
LITELLM_MASTER_KEY: litellm-master-key # 必要に応じて変更
PROXY_DEFAULT_TEAM_DISABLED: true
STORE_MODEL_IN_DB: true
ports:
- "4000:4000"
volumes:
- ./config.yaml:/app/config.yaml
command: ["--config", "/app/config.yaml", "--detailed_debug"]
postgres:
# https://www.docker.com/ja-jp/blog/how-to-use-the-postgres-docker-official-image/
image: postgres:17
restart: always
environment: # 必要に応じて変更
POSTGRES_DB: litellm-db
POSTGRES_USER: litellm-user
POSTGRES_PASSWORD: litellm-password
ports:
- "5432:5432"
healthcheck:
test: ["CMD-SHELL", "pg_isready -U litellm-user -d litellm-db"]
interval: 1s
timeout: 5s
retries: 10
LiteLLM + アプリケーション推論プロファイル
アプリケーション推論プロファイルの作成時に指定するモデル(システム定義の推論プロファイル、又はベースモデルARN)は1つです。
個人のLLM利用料をアプリケーション推論プロファイルのみで追跡しようとすると、
人数×利用するモデル数分のプロファイル作成が必要となります。
LiteLLMを利用する場合、Virtual Key単位、個人単位、Team(チームやプロジェクト等)単位の料金はLiteLLMの機能で追跡可能なので、
これらの単位でアプリケーション推論プロファイルを用意する必要はないと考えられます。
今回は、上記より大きな組織単位である事業部門が実際にコストを負担すると想定して、部門毎にアプリケーション推論プロファイルを作成してみます。
(LiteLLMのEnterprise版であればOrganizationという機能があるので、部門のコスト追跡もLiteLLMに任せられるかもしれません。)
AWSアカウント
├── 部門A (部門Aアプリケーション推論プロファイル(Claude4, Claude3.7))
│ └── Team X(LiteLLM Team X)
│ ├── Team X Member 1
│ ├── Team X Member 2
│ └── Team X Member 3
└── 部門B (部門Bアプリケーション推論プロファイル(Claude4, Claude3.7))
└── Team Y(LiteLLM Team Y)
├── Team Y Member 1
└── Team Y Member 2
やってみる
アプリケーション推論プロファイルの作成
最初にアプリケーション推論プロファイルを作成します。
コストを追跡したい単位(今回は部門Aと部門B)×利用するモデル数(今回はClaude Sonnet4と3.7)分なので、4つ作成することにします。
今回はアクセスキーでLiteLLMとBedrockを接続したかったので、IAM Userも一緒に作成しています。
CloudFormationテンプレート
# Bedrock Application Inference Profiles and IAM Users for Divisions
AWSTemplateFormatVersion: '2010-09-09'
Resources:
# ========== DivisionA - Sonnet4 ==========
Sonnet4InferenceProfileDivisionA:
Type: AWS::Bedrock::ApplicationInferenceProfile
Properties:
InferenceProfileName: sonnet4-division-a
ModelSource:
CopyFrom: !Sub
- arn:${AWS::Partition}:bedrock:${AWS::Region}:${AWS::AccountId}:inference-profile/us.anthropic.claude-sonnet-4-20250514-v1:0
- {}
Tags:
- Key: Division
Value: A
- Key: Model
Value: Sonnet4
# ========== DivisionA - Sonnet37 ==========
Sonnet37InferenceProfileDivisionA:
Type: AWS::Bedrock::ApplicationInferenceProfile
Properties:
InferenceProfileName: sonnet37-division-a
ModelSource:
CopyFrom: !Sub
- arn:${AWS::Partition}:bedrock:${AWS::Region}:${AWS::AccountId}:inference-profile/us.anthropic.claude-3-7-sonnet-20250219-v1:0
- {}
Tags:
- Key: Division
Value: A
- Key: Model
Value: Sonnet37
# ========== DivisionB - Sonnet4 ==========
Sonnet4InferenceProfileDivisionB:
Type: AWS::Bedrock::ApplicationInferenceProfile
Properties:
InferenceProfileName: sonnet4-division-b
ModelSource:
CopyFrom: !Sub
- arn:${AWS::Partition}:bedrock:${AWS::Region}:${AWS::AccountId}:inference-profile/us.anthropic.claude-sonnet-4-20250514-v1:0
- {}
Tags:
- Key: Division
Value: B
- Key: Model
Value: Sonnet4
# ========== DivisionB - Sonnet37 ==========
Sonnet37InferenceProfileDivisionB:
Type: AWS::Bedrock::ApplicationInferenceProfile
Properties:
InferenceProfileName: sonnet37-division-b
ModelSource:
CopyFrom: !Sub
- arn:${AWS::Partition}:bedrock:${AWS::Region}:${AWS::AccountId}:inference-profile/us.anthropic.claude-3-7-sonnet-20250219-v1:0
- {}
Tags:
- Key: Division
Value: B
- Key: Model
Value: Sonnet37
# ========== User & Creds ==========
LiteLLMUser:
Type: AWS::IAM::User
Properties:
UserName: cm-ogura-litellm-bedrock
LiteLLMUserPolicy:
Type: AWS::IAM::Policy
Properties:
PolicyDocument:
Version: '2012-10-17'
Statement:
- Action:
- bedrock:InvokeModel
- bedrock:InvokeModelWithResponseStream
Effect: Allow
Resource:
- !GetAtt Sonnet4InferenceProfileDivisionA.InferenceProfileArn
- !GetAtt Sonnet37InferenceProfileDivisionA.InferenceProfileArn
- !GetAtt Sonnet4InferenceProfileDivisionB.InferenceProfileArn
- !GetAtt Sonnet37InferenceProfileDivisionB.InferenceProfileArn
- Action:
- bedrock:InvokeModel
- bedrock:InvokeModelWithResponseStream
Condition:
StringLike:
bedrock:InferenceProfileArn:
- !GetAtt Sonnet4InferenceProfileDivisionA.InferenceProfileArn
- !GetAtt Sonnet37InferenceProfileDivisionA.InferenceProfileArn
- !GetAtt Sonnet4InferenceProfileDivisionB.InferenceProfileArn
- !GetAtt Sonnet37InferenceProfileDivisionB.InferenceProfileArn
Effect: Allow
Resource:
- arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-sonnet-4-20250514-v1:0
- arn:aws:bedrock:us-east-2::foundation-model/anthropic.claude-sonnet-4-20250514-v1:0
- arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-sonnet-4-20250514-v1:0
- arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-3-7-sonnet-20250219-v1:0
- arn:aws:bedrock:us-east-2::foundation-model/anthropic.claude-3-7-sonnet-20250219-v1:0
- arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-3-7-sonnet-20250219-v1:0
PolicyName: LiteLLMUserPolicy
Users:
- !Ref LiteLLMUser
LiteLLMUserKey:
Type: AWS::IAM::AccessKey
Properties:
UserName: !Ref LiteLLMUser
LiteLLMUserCreds:
Type: AWS::SecretsManager::Secret
Properties:
Description: Bedrock API creds for litellm user
SecretString: !Sub
- '{"AccessKeyId":"${AccessKeyId}","SecretAccessKey":"${SecretAccessKey}"}'
- AccessKeyId: !Ref LiteLLMUserKey
SecretAccessKey: !GetAtt LiteLLMUserKey.SecretAccessKey
UpdateReplacePolicy: Delete
DeletionPolicy: Delete
プロファイルに設定するタグには、部門名とモデル名にしました。
CDKで作成する場合は以下が参考になります。
LiteLLMへ推論プロファイルを登録
config.yaml
にモデルを記述する場合、model_id
を追加し、アプリケーション推論プロファイルをセットします。
us-east-1のClaude Sonnet4の例
model_list:
- litellm_params:
aws_region_name: us-east-1
aws_access_key_id: <access key>
aws_secret_access_key: <secret access key>
model: bedrock/us.anthropic.claude-sonnet-4-20250514-v1:0
model_id: arn:aws:bedrock:us-east-1:<aws account>:application-inference-profile/xxxxxxxxxx # アプリケーション推論プロファイル
model_name: Claude Sonnet 4 Div A Team X
LiteLLMのUIから同じ内容を登録する場合、「Add Model」から登録します。
アプリケーション推論プロファイルを使用する場合は、Provider、LiteLLM Model Name(s)とクレデンシャル情報に加えて、
画面下のAdvanced Settings
-> LiteLLM Params
にJSON形式でmodel_id
を追加でセットします。
モデルの追加
{"model_id": "<アプリケーション推論プロファイルのID>"}
LiteLLM Paramsの内容は、現状のUIだとモデル編集画面で変更できないようですので、
入力したら、「Add Model」する前に「Test Connect」ボタンで疎通確認をしておきましょう。
以下の表示が返ってくれば疎通できていると思います。
Test Connect
Teamへモデルを登録
Teamを作って運用する場合、モデルとチームを紐づけて、利用可能モデルをコントロールすることがあると思います。
この場合は各Teamに対して利用可能モデルを設定します。
Teamの作成
┌─────────┐ ┌─────────────────────────────────────────────────────────┐
│ Team X │────│ Division A Claude 4 Application Inference Profile │
│ │ └─────────────────────────────────────────────────────────┘
│ │ ┌─────────────────────────────────────────────────────────┐
│ │────│ Division A Claude 3.7 Application Inference Profile │
└─────────┘ └─────────────────────────────────────────────────────────┘
┌─────────┐ ┌─────────────────────────────────────────────────────────┐
│ Team Y │────│ Division B Claude 4 Application Inference Profile │
│ │ └─────────────────────────────────────────────────────────┘
│ │ ┌─────────────────────────────────────────────────────────┐
│ │────│ Division B Claude 3.7 Application Inference Profile │
└─────────┘ └─────────────────────────────────────────────────────────┘
これでTeam MemberがVirtual Keyを発行する時に、追加したプロファイルのモデルが選択可能になります。
新しいモデルをLiteLLMに追加したい場合、LiteLLMにモデル(アプリケーション推論プロファイル)を追加した後、
このように各Teamにもモデルを紐づけていく必要があります。
Teamへの紐づけをモデルではなくModel Access Group経由で行っておくと、
今後モデルを追加した時に、モデルをTeamへ紐づける手順を省略できるので少し楽にできます。
モデル追加時に、Model Access Groupの名前を指定しておきます。
モデルの追加
config.yamlの場合
- litellm_params:
(省略)
model_name: Claude Sonnet 4 Div A Team Y
model_info:
access_groups: ["team-y-group"]
Teamに利用可能モデルを設定する際、モデルの代わりにModel Access Groupの名前を指定して紐づけます。
Teamの作成
┌─────────┐ ┌──────────────────┐ ┌─────────────────────────────────────────────────────────┐
│ Team X │────│ Model Access │────│ Division A Claude 4 Application Inference Profile │
│ │ │ Group X │ └─────────────────────────────────────────────────────────┘
│ │ │ │ ┌─────────────────────────────────────────────────────────┐
│ │ │ │────│ Division A Claude 3.7 Application Inference Profile │
└─────────┘ └──────────────────┘ └─────────────────────────────────────────────────────────┘
┌─────────┐ ┌──────────────────┐ ┌─────────────────────────────────────────────────────────┐
│ Team Y │────│ Model Access │────│ Division B Claude 4 Application Inference Profile │
│ │ │ Group Y │ └─────────────────────────────────────────────────────────┘
│ │ │ │ ┌─────────────────────────────────────────────────────────┐
│ │ │ │────│ Division B Claude 3.7 Application Inference Profile │
└─────────┘ └──────────────────┘ └─────────────────────────────────────────────────────────┘
今後は、モデルを追加する際に適切なModel Access Groupを指定しておくことで、Teamへの紐づけまで完了する、という形になります。
まとめ
LiteLLMでアプリケーション推論プロファイルを利用する方法を確認しました。
LiteLLMで管理するより大きなグループで料金を確認したい場合や、厳密にBedrockの利用料金を確認したい場合に活用できると思います。
LiteLLMに新たなモデルを追加する場合、モデルのアプリケーション推論プロファイルを作らなければならない点は手間がかかります。
LiteLLMを併用する場合は、アプリケーション推論プロファイルの作成は組織等の大きな単位で作成することで管理の手間を減らし、
個人単位やチーム単位のコスト管理はLiteLLMにまかせてしまいましょう。