
LiteLLMの予算機能でLLMの利用料金に上限を設定する
大阪オフィスの小倉です。
Amazon Bedrock等をLiteLLM経由で利用する際、LiteLLMの予算管理機能を使ってユーザの利用料金に上限を設ける方法を試しました。
💰 Budgets, Rate Limits | liteLLM
LiteLLM予算の階層構造
OSS版LiteLLMで管理可能な階層は以下になります。
階層 | 適用範囲 | 主な用途 |
---|---|---|
Global | システム全体 | 全体コスト上限 |
Team | チーム単位 | チームやプロジェクト全体の予算 |
Team Member | チーム内の個人 | チームやプロジェクト内の個人の予算 |
Internal User | 個人(非Team)(※後述) | 個人の非Team作業の予算(※後述) |
Virtual Key | 個別のAPIキー | 特定用途の制限 |
LiteLLM Enterprise版は更にOrganizationで管理できそうですが、今回の検証からは対象外としています。
Teamは任意で作成できるグループです。グループ内でさらにメンバー単位予算を設定するものがTeam Member予算です。
Virtual Key発行時、Team IDを紐づけることが可能です。
Virtual Key作成画面
Virtual KeyにTeam IDを紐づけるかどうかで、利用料の計上先が以下のように変わります。
階層(計上先) | Team IDが無いVirtual Key | Team IDがあるVirtual Key |
---|---|---|
Global | ◯ | ◯ |
Team | ✗ | ◯ |
Team Member | ✗ | ◯ |
Internal User | ◯ | ◯ |
Virtual Key | ◯ | ◯ |
Team IDの有無に関わらずInternal Userの料金には計上されます。
計上された利用料に対する予算のチェックも、使用するKeyのTeam IDの有無によって変わります。
階層(チェック予算) | Team IDが無いVirtual Key | Team IDがあるVirtual Key |
---|---|---|
Global | ◯ | ◯ |
Team | ✗ | ◯ |
Team Member | ✗ | ◯ |
Internal User | ◯ | ✗ |
Virtual Key | ◯ | ◯ |
Team IDがあるKeyを使用する場合は、Internal User予算のチェックは行わず、Team/Team Member予算をチェックするようになっています。
運用イメージ
1.Teamを使用しない運用
Teamを使用しない運用の場合、各ユーザの利用料上限はInternal User予算で設定すればOKです。
以下はユーザにつき$50まで利用を許可する構成です。
ユーザが自分でVirtual Keyを発行できるようにして、各Keyの予算はユーザ自身で設定するとよさそうです。
※以降、Teamに紐づかないVirtual KeyをPersonal Keyと表記します。
Global予算
└── Internal Users
├── User A (メンバーA) - Internal User予算 ($50)
│ ├── Personal Key 1
│ ├── Personal Key 2
│ └── Personal Key 3
└── User B (メンバーB) - Internal User予算 ($50)
├── Personal Key 1
└── Personal Key 2
2.全てTeamを紐づける運用
Teamを利用すると、プロジェクト毎に予算管理が可能になります。
具体的なプロジェクトだけでなく、個人の検証予算についてもTeamで管理するとよさそうです。
以下の例でMemberAは、Team Xとして$100、Team Yとして$75なので、合計$175まで使用可能です。
Global予算
├── Team X (プロジェクトX) - Team予算 ($300)
│ ├── Member A - Team Member予算 ($100)
│ │ ├── Team X Key 1
│ │ └── Team X Key 2
│ ├── Member B - Team Member予算 ($100)
│ │ └── Team X Key 1
│ └── Member C - Team Member予算 ($100)
│ └── Team X Key 1
└── Team Y (プロジェクトY) - Team予算 ($150)
├── Member A - Team Member予算 ($75)
│ └── Team Y Key 1
└── Member B - Team Member予算 ($75)
├── Team Y Key 1
└── Team Y Key 2
3.Team使用、未使用の混在
Teamに紐づくキーと紐づかないキーを混在して運用することも可能ですが、管理が難しくなるので個人的にはオススメしません。
Global予算
├── Team X (プロジェクトX) - Team予算 ($300)
│ └── Member A - Team Member予算 ($100)
│ └── Team X Key 1
├── Team Y (プロジェクトY) - Team予算 ($150)
│ └── Member A - Team Member予算 ($75)
│ └── Team Y Key 1
└── Internal Users
└── Member A - Internal User予算 ($200)
└── Personal Key 1
上記例のMemberAは、
- Internal Userとして$200まで使用可能
- Team Xとして$100まで使用可能
- Team Yとして$75まで使用可能
となります。
先に各Teamの予算を使い切った場合、$200 - $100 - $75 = $25
となり、Teamに紐づかないKeyを通して残りの$25を利用できます。
但し、先にPersonal Keyで$200を使ってしまうことも可能です。
Team X,YのKeyはInternal User予算をチェックしないため、この後も利用でき、合計で$375使えることになります。
やってみる
今回は 「Teamを使用しない運用」「全てTeamを紐づける運用」を試します。
以下のテストデータを使って確認します。括弧()内は料金上限です。
User A | User B | User C | |
---|---|---|---|
Global | ($0.1) | ($0.1) | ($0.1) |
Team | - | Team X($0.04) Team Y($0.05) |
Team X($0.04) |
Team Member | - | Team X Member($0.03) Team Y Member($0.02) |
Team X Member(No Limit) |
Internal User | User A($0.02) | User B($0.02) ※personal keyに対する制限 |
User C($0.02) ※personal keyに対する制限 |
Virtual Key | A-1 Key($0.01) A-2 Key(No Limit) |
【TeamX】 B-1 Key($0.01) 【TeamX】B-2 Key(No Limit) 【TeamY】B-3 Key(No Limit) |
【TeamX】C-1 Key(No Limit) |
Internal User
Team
Virtual Key
Teamを使用しない運用の場合
User AのVirtual Keyを使って、LiteLLMのTest Key画面からキーを使った呼び出しをテストします。
A-1のキーを使ってLLMを利用すると、Virtual Key、Internal Userに料金が計上されていきます。
実行を続けると、$0.01のVirtual Key予算に抵触したためエラーとなります。
キー予算の設定が無いA-2のVirtual Keyに変更すると引き続き実行できますが、次にInternal User予算に抵触してエラーとなります。
この場合、同じユーザで別のVirtual Keyを発行しても、ユーザ単位の予算上限に抵触しているので実行はできません。
Teamを使用した運用の場合
User BのB-1キーを使ってLLMを利用すると、最初にVirtual Key予算に抵触します。
B-2キーを使うと、Team Xメンバー予算上限の$0.03までは利用できます。
今回は応答されるトークン量のせいか、$0.03を超えた後でブロックされました
User CもC-1キーを通してTeam Xとして利用できる筈ですが、User BがTeam X全体予算$0.04を超えて利用しているので、C-1キーでは実行できませんでした。
User BはTeam Xのメンバーとしては上限に達しましたが、Team YのキーであるB-3キーを使うと、Team Yメンバーの上限までは利用できます。
使用料が加算されていることがわかります。
Internal User
注意事項
料金情報と料金チェック
LiteLLMでの利用料金計算は、独自に保有するmodel_prices_and_context_window.jsonを元に計算しているようです。
今回試したケースのように、LLMから一度に返されるトークンの量が多い場合には、設定した予算を若干超えてしまうことがありました。
予算は厳密な管理を求めるのではなく、目安として設定するのがよさそうです。
Personal Keyを発行させたくない場合
LiteLLMでVirtual KeyをUIから発行する場合、Team IDの指定は任意入力です。このため、全てのKeyにTeamを紐づける運用を行いたい場合でも、
Key発行時に誤ってTeam IDを未入力で発行してしまうことはありえます。
config.yaml
にdefault_team_disabled : true
を設定すると、Key発行時にTeam IDの指定を必須にできる記述がありますが、
現状Issueが起票されており、必須入力の動きにはなりませんでした。
- All settings | liteLLM
- [Bug]: default_team_disabled setting is not work · Issue #10151 · BerriAI/litellm · GitHub
ワークアラウンドとして、全てTeam IDを紐づける運用の場合でも、Internal User予算に$0
をしておくことで緩和可能です。
Team ID無しキーの発行は行えますが、利用されることを防ぐことができます。
補足
検証データを作成したAPIリクエスト例です。
Global予算の設定
config.yamlでmax_budget
,budget_duration
を指定します。
general_settings:
database_url: (省略)
master_key: (省略)
litellm_settings:
max_budget: 0.1
budget_duration: 30d
default_team_params:
models: []
model_list:
(省略)
Internal Userの作成
max_budget
, budget_duraiton
を指定します。
curl --location 'http://localhost:4000/user/new' \
--header 'Authorization: Bearer <master key>' \
--header 'Content-Type: application/json' \
--data-raw '{
"user_id": "user_a",
"user_email": "<email address>",
"max_budget": 0.02,
"budget_duration": "30d"
}'
Teamの作成
max_budget
, budget_duraiton
を指定します。
curl --location 'http://localhost:4000/team/new' \
--header 'Authorization: Bearer <master key>' \
--header 'Content-Type: application/json' \
--data '{
"team_alias": "team_x",
"max_budget": 0.04,
"budget_duration": "30d"
}'
UserをTeamに参加させ、Team Member予算を設定
Team Member予算はmax_budget_in_team
で指定します。
curl --location 'http://localhost:4000/team/member_add' \
--header 'Authorization: Bearer <master key>' \
--header 'Content-Type: application/json' \
--data-raw '{
"team_id": "<team id>",
"member": {
"role": "user",
"user_email": "<email address>"
},
"max_budget_in_team": 0.03
}'
Virtual Keyの作成
キー単位予算はmax_budget
, budget_duraiton
を指定します。
Teamに紐づける場合は、team_id
も指定します。
curl --location 'http://localhost:4000/key/generate' \
--header 'Authorization: Bearer <master key>' \
--header 'Content-Type: application/json' \
--data '{
"key_alias": "b_1_key",
"user_id": "user_b",
"team_id": "<team id>",
"max_budget": 0.01,
"budget_duration": "30d"
}'
まとめ
LiteLLMの予算管理機能を試してみました。
料金チェックはどうしても厳密ではないので、目安として扱うのがよさそうです。
社内での管理用として利用する際は、ユーザには自身でVirtual Keyを発行できるようにしつつ、
予算管理はTeam、Team Member予算機能を使って目安となる上限金額を設定しておくと、安心して利用できそうですね。