目 录CONTENT

文章目录

使用 Amazon Bedrock 自定义模型导入功能部署 GPT-OSS 模型

Administrator
2025-11-25 / 0 评论 / 0 点赞 / 0 阅读 / 0 字

📢 转载信息

原文链接:https://aws.amazon.com/blogs/machine-learning/deploy-gpt-oss-models-with-amazon-bedrock-custom-model-import/

原文作者:Prashant Patel, Ainesh Sootha, and Sandeep Akhouri


Amazon Bedrock Custom Model Import 现在支持带有开源权重的 OpenAI 模型,包括参数为 200 亿和 1200 亿的 GPT-OSS 变体。GPT-OSS 模型提供推理能力,并可与 OpenAI 聊天补全 API 配合使用。通过保持完整的 OpenAI API 兼容性,组织可以将现有应用程序迁移到 AWS,从而获得企业级的安全性、扩展性和成本控制。

在本文中,我们将展示如何在 Amazon Bedrock 上使用自定义模型导入来部署 GPT-OSS-20B 模型,同时与您当前的应用程序保持完全的 API 兼容性。

Amazon Bedrock 自定义模型导入概述

Amazon Bedrock 自定义模型导入功能允许您将定制的模型带入与访问基础模型 (FM) 相同的无服务器环境中。您获得了一个统一的 API 来处理所有事情;您无需处理多个端点或管理单独的基础设施。

要使用此功能,请将模型文件上传到 Amazon Simple Storage Service (Amazon S3),然后通过 Amazon Bedrock 控制台启动导入。AWS 负责繁重的工作,包括预置 GPU、配置推理服务器以及根据需求自动扩展。您可以专注于您的应用程序,而 AWS 则负责管理基础设施。

GPT-OSS 模型支持 OpenAI 聊天补全 API,包括消息数组、角色定义(系统、用户或助手)以及带有 token 用量指标的标准响应结构。您可以将应用程序指向 Amazon Bedrock 端点,它们将无需或仅需对代码库进行最少更改即可工作。

GPT-OSS 模型概述

GPT-OSS 模型是 OpenAI 自 GPT-2 以来发布的第一个开源权重语言模型,根据 Apache 2.0 许可发布。您可以免费下载、修改和使用它们,包括用于商业应用。这些模型专注于推理、工具使用和高效部署。请根据您的需求选择合适的模型:

  • GPT-OSS-20B (210 亿参数) – 该模型非常适合对速度和效率要求最高的应用程序。尽管有 210 亿个参数,但每个 token 只激活 36 亿个,因此它可以在仅 16 GB 内存的边缘设备上流畅运行。凭借 24 层、32 个专家(每个 token 激活 4 个)和 128k 的上下文窗口,它的性能与 OpenAI 的 o3-mini 相当,同时可以本地部署以实现更快的响应时间。
  • GPT-OSS-120B (1170 亿参数) – 专为复杂的推理任务而构建,例如编码、数学和代理工具使用,它每个 token 激活 51 亿个参数。凭借 36 层、128 个专家(每个 token 激活 4 个)和 128k 的上下文窗口,它的性能与 OpenAI 的 o4-mini 相当,同时可以在单个 80GB GPU 上高效运行。

这两个模型都使用混合专家 (MoE) 架构——模型组件(专家)的子集处理不同类型的任务,每次请求只激活最相关的专家。这种方法为您提供了强大的性能,同时使计算成本保持在可控范围内。

了解 GPT-OSS 模型格式

当您从 Hugging Face 下载 GPT-OSS 模型时,您会得到协同工作的多种文件类型:

  • 权重文件 (.safetensors) – 实际的模型参数
  • 配置文件 (config.json) – 定义模型如何工作的设置
  • 分词器文件 – 处理文本
  • 索引文件 (model.safetensors.index.json) – 将权重数据映射到特定文件

索引文件需要特定的结构才能与 Amazon Bedrock 一起工作。它必须在根级别包含一个 metadata 字段。这可以是空的 ({}) 或包含总模型大小(文本模型必须小于 200 GB)。

来自 Hugging Face 的模型有时会包含 Amazon Bedrock 不支持的额外元数据字段,例如 total_parameters。您必须在导入之前删除这些字段。正确的结构应如下所示:

{
"metadata": {},
"weight_map": {
"lm_head.weight": "model-00009-of-00009.safetensors",
    ...
  }
}

确保在启动 Amazon S3 上传之前排除 metal 目录。

解决方案概述

在本文中,我们将通过 Amazon Bedrock 自定义模型导入来完成完整的部署过程。我们使用 Tonic/med-gpt-oss-20b 模型,它是 OpenAI GPT-OSS-20B 的一个微调版本,专门针对医疗推理和指令遵循进行了优化。

部署过程涉及四个主要步骤:

  1. 从 Hugging Face 下载模型文件并为 AWS 准备它们。
  2. 将模型文件上传到 Amazon S3。
  3. 使用 Amazon Bedrock 自定义模型导入进行导入,将您的模型引入 Amazon Bedrock。
  4. 使用兼容 OpenAI 的 API 调用调用您的模型以测试部署。

下图说明了部署工作流程。

部署工作流程图

先决条件

在开始部署您的 GPT-OSS 模型之前,请确保您拥有以下内容:

  • 一个具有适当权限的活动 AWS 账户
  • AWS Identity and Access Management (IAM) 权限,用于:
    • 在 Amazon Bedrock 中创建模型导入作业
    • 将文件上传到 Amazon S3
    • 部署后调用模型
    • 使用自定义模型导入服务角色
  • 目标 AWS 区域中的 S3 存储桶
  • 大约 40 GB 的本地磁盘空间用于模型下载
  • 对美国东部 1 (弗吉尼亚北部) 区域的访问权限(GPT-OSS 基于自定义模型的要求)
  • 已安装 AWS Command Line Interface (AWS CLI) 2.x 版本
  • Hugging Face CLI(使用 pip install -U "huggingface_hub[cli]" 安装)

下载和准备模型文件

要使用启用了快速传输的 Hugging Face Hub 库下载 GPT-OSS 模型,请使用以下代码:

import os
os.environ['HF_HUB_ENABLE_HF_TRANSFER'] = '1'
from huggingface_hub import snapshot_download local_dir = snapshot_download(
    repo_id="Tonic/med-gpt-oss-20b",
    local_dir="./med-gpt-oss-20b",
)print(f"Download complete! Model saved to: {local_dir}")

下载完成后(40 GB 需要 10-20 分钟),请验证 model.safetensors.index.json 文件的结构。如有必要,请对其进行编辑以确保 metadata 字段存在(它们可以为空):

{
"metadata": {},
"weight_map": {
"lm_head.weight": "model-00009-of-00009.safetensors",
    ...
  }
} ec2-user@ip-XYZ  ~/gptoss/med-gpt-oss-20b  ls  -lah
total 39G
drwxr-xr-x. 3 ec2-user ec2-user  16K Nov 10 19:38 .
drwxr-xr-x. 3 ec2-user ec2-user   44 Nov 10 21:31 ..
drwxr-xr-x. 3 ec2-user ec2-user   25 Nov 10 18:57 .cache
-rw-r--r--. 1 ec2-user ec2-user  17K Nov 10 18:57 chat_template.jinja
-rw-r--r--. 1 ec2-user ec2-user 1.6K Nov 10 18:57 config.json
-rw-r--r--. 1 ec2-user ec2-user  160 Nov 10 18:57 generation_config.json
-rw-r--r--. 1 ec2-user ec2-user 1.6K Nov 10 18:57 .gitattributes
-rw-r--r--. 1 ec2-user ec2-user 4.2G Nov 10 18:57 model-00001-of-00009.safetensors
-rw-r--r--. 1 ec2-user ec2-user 4.6G Nov 10 18:57 model-00002-of-00009.safetensors
-rw-r--r--. 1 ec2-user ec2-user 4.6G Nov 10 18:57 model-00003-of-00009.safetensors
-rw-r--r--. 1 ec2-user ec2-user 4.6G Nov 10 18:57 model-00004-of-00009.safetensors
-rw-r--r--. 1 ec2-user ec2-user 4.6G Nov 10 18:57 model-00005-of-00009.safetensors
-rw-r--r--. 1 ec2-user ec2-user 4.6G Nov 10 18:57 model-00006-of-00009.safetensors
-rw-r--r--. 1 ec2-user ec2-user 4.6G Nov 10 18:57 model-00007-of-00009.safetensors
-rw-r--r--. 1 ec2-user ec2-user 4.6G Nov 10 18:57 model-00008-of-00009.safetensors
-rw-r--r--. 1 ec2-user ec2-user 2.6G Nov 10 18:57 model-00009-of-00009.safetensors
-rw-r--r--. 1 ec2-user ec2-user  33K Nov 10 19:38 model.safetensors.index.json
-rw-r--r--. 1 ec2-user ec2-user 5.4K Nov 10 18:57 README.md
-rw-r--r--. 1 ec2-user ec2-user  440 Nov 10 18:57 special_tokens_map.json
-rw-r--r--. 1 ec2-user ec2-user 4.2K Nov 10 18:57 tokenizer_config.json
-rw-r--r--. 1 ec2-user ec2-user  27M Nov 10 18:57 tokenizer.json

将模型文件上传到 Amazon S3

在导入模型之前,您必须将模型文件存储在 Amazon S3 存储桶中,以便 Amazon Bedrock 可以访问它们。请完成以下步骤:

  1. 在 Amazon S3 控制台中,在导航窗格中选择 Buckets
  2. 创建新存储桶或打开现有存储桶。
  3. 上传您的模型文件。

或者,使用 AWS CLI 将文件上传到目标 Amazon Bedrock 区域中的 S3 存储桶:

aws s3 sync ./med-gpt-oss-20b/ s3://amzn-s3-demo-bucket/med-gpt-oss-20b/

40 GB 的上传通常在 5-10 分钟内完成。验证文件已上传:

aws s3 ls s3://amzn-s3-demo-bucket/med-gpt-oss-20b/ --human-readable

记下您的 S3 URI(例如 s3://amzn-s3-demo-bucket/med-gpt-oss-20b/)以供导入作业使用。

输出文件使用 S3 存储桶的加密配置进行加密。这些文件根据您设置 S3 存储桶的方式,使用 SSE-S3 服务器端加密AWS Key Management Service (AWS KMS) SSE-KMS 加密加密。

使用 Amazon Bedrock Custom Import 导入模型

现在您的模型文件已上传到 Amazon S3,您可以将模型导入 Amazon Bedrock,在那里它将被处理并可用于推理。完成以下步骤:

  1. 在 Amazon Bedrock 控制台中,在导航窗格中选择 Imported models
  2. 选择 Import model
  3. 对于 Model name,输入 gpt-oss-20b
  4. 对于 Model import source,选择 Amazon S3 bucket
  5. 对于 S3 location,输入 s3://amzn-s3-demo-bucket/med-gpt-oss-20b/
  6. 对于 Service access,选择 Create and use a new service role。Amazon Bedrock 控制台会自动生成一个具有正确信任关系和 Amazon S3 读取权限的角色。
  7. 选择 Import model 以启动导入作业。

Bedrock 控制台导入模型界面

要使用 AWS CLI,请使用以下代码:

aws bedrock create-model-import-job 
  --job-name "gpt-oss-20b-import-$(date +%Y%m%d-%H%M%S)" 
  --imported-model-name "gpt-oss-20b" 
  --role-arn "arn:aws:iam::YOUR-ACCOUNT-ID:role/YOUR-ROLE-NAME" 
  --model-data-source "s3DataSource={s3Uri=s3://amzn-s3-demo-bucket/med-gpt-oss-20b/}"

对于 20B 参数模型,模型导入通常在 10-15 分钟内完成。您可以在 Amazon Bedrock 控制台或使用 AWS CLI 监控进度。完成后,记下 importedModelArn,您将使用它来调用模型。

使用兼容 OpenAI 的 API 调用模型

模型导入完成后,您可以使用熟悉的 OpenAI 聊天补全 API 格式对其进行测试,以验证其是否按预期工作:

  1. 创建一个名为 test-request.json 的文件,其中包含以下内容:
{
  "messages": [
    {
      "role": "system",
      "content": "You are a helpful AI assistant."
    },
    {
      "role": "user",
      "content": "What are the common symptoms of Type 2 Diabetes?"
    }
  ],
  "max_tokens": 500,
  "temperature": 0.7
}
  1. 使用 AWS CLI 将请求发送到导入的模型端点:
aws bedrock-runtime invoke-model 
  --model-id "arn:aws:bedrock:us-east-1:YOUR-ACCOUNT-ID:imported-model/MODEL-ID" 
  --body file://test-request.json 
  --cli-binary-format raw-in-base64-out
response.json
cat response.json | jq '.'

响应以标准的 OpenAI 格式返回:

{
  "id": "chatcmpl-f06adcc78daa49ce9dd2c58f616bad0c",
  "object": "chat.completion",
  "created": 1762807959,
  "model": "YOUR-ACCOUNT-ID-MODEL-ID",
  "choices": [
    {
      "index": 0,
      "message": {
        "role": "assistant",
        "content": "Type 2 Diabetes often presents with a range of symptoms...",
        "refusal": null,
        "function_call": null,
        "tool_calls": []
      },
      "finish_reason": "stop"
    }
  ],
  "usage": {
    "prompt_tokens": 98,
    "completion_tokens": 499,
    "total_tokens": 597
  }
}

响应结构与 OpenAI 的格式完全匹配——choices 包含响应,usage 提供 token 计数,finish_reason 指示完成状态。现有的 OpenAI 响应解析代码无需修改即可工作。

该模型的强大优势在于其透明性reasoning_content 字段为我们提供了模型在生成最终响应之前内部推理过程的信息。这种透明度是闭源 API 所不具备的。

清理

完成后,请清理您的资源以避免不必要的费用:

aws bedrock delete-imported-model --model-identifier "arn:aws:bedrock:us-east-1:ACCOUNT:imported-model/MODEL-ID" aws s3 rm s3://amzn-s3-demo-bucket/med-gpt-oss-20b/ --recursive

如果您不再需要 IAM 角色,请使用 IAM 控制台将其删除。

从 OpenAI 迁移到 Amazon Bedrock

从 OpenAI 迁移所需的代码更改最少——只有调用方法发生变化,而消息结构保持不变。

对于 OpenAI,请使用以下代码:

import openai
response = openai.ChatCompletion.create(model="....", messages=[...])

对于 Amazon Bedrock,请使用以下代码:

import boto3, json
bedrock = boto3.client('bedrock-runtime')
response = bedrock.invoke_model(
    modelId='arn:aws:bedrock:us-east-1:ACCOUNT:imported-model/MODEL-ID',
    body=json.dumps({"messages": [...]})
)

迁移是直接的,您将获得可预测的成本、更好的数据隐私以及根据您的特定需求微调模型的潜力。

最佳实践

请考虑以下最佳实践:

  • 文件验证 – 上传前,请验证 model.safetensors.index.json 是否具有正确的元数据结构,引用的 safetensors 文件是否存在,并且分词器是否受支持。本地验证可以节省导入重试时间。
  • 安全性 – 在 Amazon Bedrock 控制台上,自动创建具有最小权限的角色。对于多个模型,使用单独的 S3 前缀来保持隔离。
  • 版本控制 – 使用描述性的 S3 路径(gpt-oss-20b-v1.0/)或带日期的导入作业名称来跟踪部署。

定价

您需要为在 Amazon Bedrock 中运行导入的自定义模型的推理付费。有关更多详细信息,请参阅计算运行自定义模型的成本Amazon Bedrock 定价

结论

在本文中,我们展示了如何使用自定义模型导入在 Amazon Bedrock 上部署 GPT-OSS 模型,同时保持完全的 OpenAI API 兼容性。现在,您可以通过最少的代码更改将现有应用程序迁移到 AWS,并获得企业级优势,包括完整的模型控制、微调功能、可预测的定价和增强的数据隐私。

准备好开始了吗?以下是您的后续步骤:

  • 选择模型大小 – 从 20B 模型开始以获得更快的响应,或对复杂推理任务使用 120B 变体
  • 设置环境 – 确保您拥有必要的 AWS 权限和 S3 存储桶访问权限
  • 尝试 Amazon Bedrock 控制台 – 使用 Amazon Bedrock 控制台导入您的第一个 GPT-OSS 模型
  • 探索高级功能 – 在基本设置工作后,考虑使用您专有数据进行微调

Amazon Bedrock 自定义模型导入在多个区域可用,并将在不久的将来扩展到更多区域。请参阅Amazon Bedrock 中按 AWS 区域划分的功能支持了解最新信息。GPT-OSS 模型最初将在美国东部 1 (弗吉尼亚北部) 区域提供。

有任何问题或反馈?请通过 AWS re:Post for Amazon Bedrock 联系我们的团队——我们很乐意听取您的体验。


关于作者

Prashant PatelPrashant Patel 是 AWS Bedrock 的高级软件开发工程师。他热衷于为企业应用程序扩展大型语言模型。在加入 AWS 之前,他曾在 IBM 从事在 Kubernetes 上生产化大规模 AI/ML 工作负载的工作。Prashant 拥有纽约大学坦登工程学院的硕士学位。在工作之余,他喜欢旅行和逗他的狗玩。

Ainesh SoothaAinesh Sootha 是 AWS 的软件开发工程师。他热衷于为企业应用程序进行性能优化和扩展大型语言模型。在加入 AWS Bedrock 之前,他曾从事 Amazon Just Walk Out 技术的身份验证系统工作。Ainesh 拥有普渡大学计算机工程学士学位。在工作之余,他喜欢弹吉他和读书。

Sandeep AkhouriSandeep Akhouri 是一位经验丰富的产品和市场进入 (GTM) 领导者,在产品管理、工程和市场进入方面拥有超过 20 年的经验。在他目前的职位之前,Sandeep 领导了在 Splunk、KX Systems、Hazelcast 和 Software AG 等领先技术公司构建 AI/ML 产品的产品管理工作。他对代理 AI模型定制以及利用生成式 AI 推动现实世界的影响充满热情。




🚀 想要体验更好更全面的AI调用?

欢迎使用青云聚合API,约为官网价格的十分之一,支持300+全球最新模型,以及全球各种生图生视频模型,无需翻墙高速稳定,文档丰富,小白也可以简单操作。

0

评论区