想玩龍蝦 🦞、 不想買 GPU => 租雲端的 LLM 來用。 Amazon 有 aws bedrock。 他們家並沒有特別便宜, 但因為我有 aws 的點數, 那就拿來用吧! 請參考: 給小白的 bedrock 簡介、 bedrock 網頁介面試用心得。 不過, 我喜歡下指令, 所以是在 debian 上面安裝 awscli 套件來測試。 假設你已經 用 aws configure 命令設定好 access key, 也略微熟悉 jq。 我們的目的只是要跟 OpenClaw 接軌, 所以只關心有哪些模型可選擇、 如何下簡單的呼叫指令, 以及價格。
AWS 在全球很多區域 (region) 都有伺服器, 各區域提供的模型不盡相同。
很粗略地統計 (下詳), 模型最豐富的區域可能是
us-west-2、 us-east-1、 us-east-2、 ap-northeast-1。
那就建一個包含上述字串的文字檔 regions.txt (每列一個區名),
等一下我們要把這幾區的模型清單抓下來。
先簡單測試一下:
aws bedrock list-foundation-models --region ap-northeast-1 。
抓回來的 json 檔裡面只有一個欄位 "modelSummaries",
我們直接只存 modelSummaries 這個大陣列。
for reg in $(cat regions.txt) ; do aws bedrock list-foundation-models --region $reg | jq .modelSummaries > ml-$reg.json ; done
然後為每一區產生一個模型 id 清單檔:
for reg in $(cat regions.txt) ; do jq '.[] | .modelId' ml-$reg.json | sed 's/"//g' | sort > ml-$reg.txt ; done
(因為傳回資料內沒有 ",", 所以大膽把所有雙引號刪掉。)
有了每一區的 ml-$reg.txt 檔, 就可以查看每一區提供哪些模型、 用 comm 指令比較兩區供應清單的差異、 用 grep 指令撈出有興趣的模型。 (例如可能只對 anthropic 家的模型有興趣) 如果想查看其中一個模型的詳細資訊, 例如 openai.gpt-oss-20b-1:0 就要回去 ml-$reg.json 檔查看完整的資料。
再來, 建立一個 query.json 內容如下:
{
"service_tier": "flex",
"messages": [
{
"role": "user",
"content": [
{
"type": "text",
"text": "請以四到五句話描述你自己,特別是與其他模型比較的長處與短處。"
}
]
}
]
}
然後在命令列上拿它去詢問一個 LLM:
aws bedrock-runtime invoke-model --model-id openai.gpt-oss-20b-1:0
--body file://query.json --cli-binary-format raw-in-base64-out response.json
順利的話, 幾十秒後, 它的回答就會放在 response.json 裡面。
有幾種常見的失敗狀況:
- model identifier is invalid => model id 剪貼錯了, 或是你要的模型在別區。 (可以用 --region us-east-1 之類的選項改選別區的模型)
- on-demand throughput isn’t supported => 要用這個模型, 必須先建立 inference profile。 例如想用 anthropic 家的模型, 還必須先簽署模型存取許可 ✍️ 才可以建立 inference profile。 我還在摸索, 目前沒有要做重要的事業, 暫時先略過。
- Validation Error => 不知道。 (例如 mistral.mistral-large-2402-v1:0)
- Malformed input request => 提供的 query.json 不完備, 該模型可能需要其他輸入參數, 例如一張圖片或一個聲音檔。
接下來, 產生價格列表:
aws pricing get-products --region us-east-1 --service-code AmazonBedrock > tmp.json
注意: 只有 us-east-1 的伺服器能夠回答查價指令。
這個指令會執行很久, 得到一個 12MB 的 json 檔。
jq '[.PriceList[] | fromjson]' tmp.json > bedrock-pricing.json
echo '供應者,模型,服務層級,價格,usagetype' > bedrock-pricing.csv
jq -r '.[] | [
.product.attributes.provider,
.product.attributes.model,
.product.attributes.service_tier,
.terms.OnDemand[].priceDimensions[].pricePerUnit.USD,
.product.attributes.usagetype
] | @csv' bedrock-pricing.json | sed 's/"//g' >> bedrock-pricing.csv
得到一萬多筆資料的 bedrock-pricing.csv。
可以用 grep 找出有興趣的模型,
或用visidata
或 LibreOffice 等等其他試算表工具查看完整內容。
例如 grep openai.gpt-oss-20b bedrock-pricing.csv | grep APN1
查出 APN1 (ap-northeast-1, 東京) 所提供的 gpt-oss-20b 服務包含以下幾種計價資訊:
OpenAI,gpt-oss-20b,priority,0.0001400000,APN1-openai.gpt-oss-20b-mantle-input-tokens-priority OpenAI,gpt-oss-20b,priority,0.0006300000,APN1-openai.gpt-oss-20b-mantle-output-tokens-priority OpenAI,gpt-oss-20b,flex,0.0001800000,APN1-openai.gpt-oss-20b-mantle-output-tokens-flex OpenAI,gpt-oss-20b,batch,0.0001800000,APN1-openai.gpt-oss-20b-mantle-output-tokens-batch OpenAI,gpt-oss-20b,flex,0.0000400000,APN1-openai.gpt-oss-20b-mantle-input-tokens-flex OpenAI,gpt-oss-20b,standard,0.0003600000,APN1-openai.gpt-oss-20b-mantle-output-tokens-standard OpenAI,gpt-oss-20b,standard,0.0000800000,APN1-openai.gpt-oss-20b-mantle-input-tokens-standard OpenAI,gpt-oss-20b,batch,0.0000400000,APN1-openai.gpt-oss-20b-mantle-input-tokens-batch
這些數字是每一千個 tokens 的費用。 其中第三個欄位 「服務層級」 決定價格 vs 延遲的取捨:
- priority: 最貴, 優先處理, 較快
- standard: 標準
- flex: 便宜, 可能會被排到後面, 較慢
- batch: 批次處理, 也會比較便宜, 但不適用於 invoke-model 的呼叫方式
例如上例的 query.json 裡面我用 "service_tier": "flex" 指定較便宜的計價方式; 而傳回的 response.json 裡面, 也有同一個欄位可以看出 aws bedrock 有沒有採用你所指定的服務層級。
有些服務沒有模型名稱, 要看 usagetype 欄位才可以猜得出來那是什麼, 例如 APN1-Guardrail-SensitiveInformationPolicyFreeUnitsConsumed 跟 外掛的安全服務 有關。
其實單從 usagetype 欄位就可以讀出區域 (APN1)、 提供者 (openai)、
模型名稱、 計價方式 (output-tokens)、 服務層級 (flex) 等等資訊。
像上面提到統計各區域提供的模型數, 我是這樣算出來的:
cut -d, -f 5 bedrock-pricing.csv | grep 'output-token' |
grep -Po '^[A-Z1-9]+' | sort | uniq -c | sort -nr | head 🖖
(寫完這篇以後, 覺得我的 jq 又進步一點了。)
大人問小孩: 「全世界的玩具隨便你挑? 這怎麼可能?
如果我要的玩具只有一個, 正好又被別人借走了呢?」
沒有留言:
張貼留言
因為垃圾留言太多,現在改為審核後才發佈,請耐心等候一兩天。