2026年4月25日 星期六

把買 GPU 的錢省下來租雲端服務: 建立 aws bedrock 模型與價格清單

想玩龍蝦 🦞、 不想買 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 裡面。

有幾種常見的失敗狀況:

  1. model identifier is invalid => model id 剪貼錯了, 或是你要的模型在別區。 (可以用 --region us-east-1 之類的選項改選別區的模型)
  2. on-demand throughput isn’t supported => 要用這個模型, 必須先建立 inference profile。 例如想用 anthropic 家的模型, 還必須先簽署模型存取許可 ✍️ 才可以建立 inference profile。 我還在摸索, 目前沒有要做重要的事業, 暫時先略過。
  3. Validation Error => 不知道。 (例如 mistral.mistral-large-2402-v1:0)
  4. 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 延遲的取捨:

  1. priority: 最貴, 優先處理, 較快
  2. standard: 標準
  3. flex: 便宜, 可能會被排到後面, 較慢
  4. 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 又進步一點了。)

沒有留言:

張貼留言

因為垃圾留言太多,現在改為審核後才發佈,請耐心等候一兩天。