AWS展示用SageMaker无服务器定制Qwen3-8B模型,通过监督微调和强化学习训练商品标签系统,提供完整端到端教程与成本优化路径。
零售目录很少以干净、整齐的属性形式到达。产品名称、描述和分类路径来自多个来源,并且不断变化。搜索、推荐和目录导航依赖于一致的标签,但手动在数千个 SKU(Stock Keeping Unit,库存量单位)上应用这些标签既缓慢又难以保持一致。
通用前沿模型可以通过 prompt 工程生成标签,但高容量标签工作流通常有更窄的目标:以正确的模式返回正确的属性,并保持一致性。当分类法稳定且输出可以通过编程评分时,定制一个较小的开源权重模型可能是更适合该任务的选择。通过这种方法,你可以直接向模型教授模式,并在遗漏标签和不必要标签之间优化权衡。你避免为工作流每次请求都不需要的广泛能力付费。
在本演练中,我们使用监督微调(SFT)定制 Qwen3-8B,然后使用基于可验证奖励的强化学习(RLVR)结合组相对策略优化(GRPO)对其进行优化。Amazon SageMaker 无服务器模型定制管理训练容量,而优化后的模型单独部署到 Amazon SageMaker 异步推理,用于面向批处理的目录丰富。请阅读 SageMaker 无服务器模型定制概述。
无服务器与 Amazon SageMaker Training Jobs(SMTJ)的对比。amazon-sagemaker-examples 仓库中较早的 Qwen3-8B 示例使用 Amazon SageMaker Training Jobs,并配备客户选择的 GPU 实例和自定义训练镜像。本演练使用 Amazon SageMaker Python SDK v3 无服务器定制训练器(SFTTrainer 和 RLVRTrainer)。当未提供计算配置时,Amazon SageMaker 为定制作业选择并释放训练容量。有关官方无服务器笔记本,请参阅 Amazon SageMaker Python SDK v3 无服务器模型定制示例。
在开始之前,准备以下资源并使用最小权限原则。将占位符值替换为你自己的 AWS 账户中的资源。
工作流有意分为三个关注点:数据准备、无服务器模型定制和推理。下图仅显示关键交接点,因此可以清楚地区分哪些阶段是无服务器训练,哪些阶段是配置好的服务。
图 1:从源目录到部署和评估的简化产品标签工作流
数据被转换一次成为版本化资产,SFT 教模型标签模式,RLVR 根据确定性奖励优化行为。最终的模型包然后托管用于推理。在本演练中,"无服务器"指的是训练路径。异步推理端点使用配置的 ml.g6.2xlarge 实例。
演练从 Kaggle 上的 Amazon Sales Dataset 开始,该数据集包含超过 1000 条产品记录。字段包括 product_id、product_name、category、about_product、pricing、ratings、reviews 和 product_links。对于此标签工作流,有用的输入是面向目录的字段,如产品名称、分类路径和描述。在生产环境中,使用你自己批准的目录和可信标签。
将转换作为 Amazon SageMaker Processing 作业运行,以便可以重复和审计相同的数据准备过程。处理脚本从 Amazon S3 读取源文件、规范目录文本和分类路径、移除不可用的行、将验证的产品信息映射到现有的九类标签目标、分割训练和验证数据,并将 JSONL 文件写回 S3。这些文件随后在 Amazon SageMaker AI Registry 中注册为版本化数据集。
每个 SFT JSONL 行包含一个 messages 数组。为提高可读性,示例进行了展开。实际文件每行包含一个完整的 JSON 对象。
{"messages": [
{"role": "system", "content": "Use the nine-category schema."},
{"role": "user", "content": "Name: USB-C Cable | Category: Cables"},
{"role": "assistant", "content": "1, Product Name: USB-C Cable\n...\n9, Occasion:"}
]}
系统轮和用户轮组成 prompt,而最后的助手轮是监督目标。将单独的训练和验证文件上传到 Amazon S3,并在 Amazon SageMaker AI Registry 中注册它们。定制训练器消费版本化数据集 ARN,而不是传统训练输入通道。
from sagemaker.ai_registry.dataset import DataSet, CustomizationTechnique
train_dataset = DataSet.create(
name="amazon-sft-train",
source="s3://amzn-s3-demo-bucket/sft/train.jsonl",
customization_technique=CustomizationTechnique.SFT,
wait=True,
)
TRAINING_DATASET_ARN = train_dataset.arn
从 dataset.arn 读取版本化 ARN,而不是手动构造它。为验证数据重复注册,并为 RLVR 版本使用 CustomizationTechnique.RLVR 注册。
Amazon SageMaker 无服务器模型定制首先教 Qwen3-8B 预期的指令到标签模式。在 Python SDK v3 中,SFTTrainer 是提交此定制作业的客户端辅助工具。训练器解析支持的 Qwen3-8B 配方、应用低秩适应(LoRA)、消费注册的数据集 ARN,并将输出发布到模型包组。因为没有提供计算参数,Amazon SageMaker 使用由 AWS 管理的无服务器训练容量,而不是客户选择的训练实例。
from sagemaker.train.common import TrainingType
from sagemaker.train.sft_trainer import SFTTrainer
trainer = SFTTrainer(
model="huggingface-reasoning-qwen3-8b",
training_type=TrainingType.LORA,
model_package_group=model_package_group,
training_dataset=TRAINING_DATASET_ARN,
validation_dataset=VALIDATION_DATASET_ARN,
sequence_length="4K",
s3_output_path=S3_OUTPUT_PATH,
role=ROLE_ARN,
# No compute argument: use serverless model customization.
)
trainer.hyperparameters.max_epochs = 3
trainer.hyperparameters.global_batch_size = 8
trainer.hyperparameters.lora_rank = 16
trainer.hyperparameters.merge_weights = True
training_job = trainer.train(wait=True)
SFT_MODEL_PACKAGE_ARN = training_job.output_model_package_arn
SFT 有望提供最大的模式适配跃升,因为它直接演示了期望的 I/O 行为。下一阶段使用 RLVR 优化剩余的质量权衡,而不是从头重新学习格式。
在 SFT 之后,模型可以遵循模式,但仍然可能遗漏预期属性或添加不必要的属性。RLVR 非常适合这种情况,因为标签输出是结构化的,可以与参考进行比较,而不需要另一个大型语言模型(LLM)来评判每个完成结果。
对于每个 SFT 行,将系统和用户轮保留在 prompt 中,将最终助手内容移到 reward_model.ground_truth。为每行提供分片感知的 ID,并将答案保留在 extra_info 中供评估器使用。
messages = json.loads(line)["messages"]
rlvr_row = {
"id": f"amazon-tagging-{split}-{index:05d}",
"prompt": messages[:-1],
"data_source": "amazon_tagging",
"reward_model": {
"style": "rule",
"ground_truth": messages[-1]["content"],
},
"extra_info": {
"answer": messages[-1]["content"],
"split": split,
},
}
RLVR 从 SFT 模型包继续,并使用确定性奖励函数对候选标签集进行评分。GRPO 为每个 prompt 生成一组完成结果。此实现使用八个候选,rollout_n=8。评估器独立评分每个完成结果。GRPO 计算组相对优势,KL 正则化限制与 SFT 参考模型的漂移。
from sagemaker.train.rlvr_trainer import RLVRTrainer
training_dataset = DataSet.get(
name="amazon-rlvr-train",
sagemaker_session=sagemaker_session,
)
validation_dataset = DataSet.get(
name="amazon-rlvr-eval",
sagemaker_session=sagemaker_session,
)
trainer = RLVRTrainer(
model=SFT_MODEL_PACKAGE_ARN,
training_type=TrainingType.LORA,
model_package_group=rlvr_model_package_group,
custom_reward_function=REWARD_EVALUATOR_ARN,
training_dataset=training_dataset,
validation_dataset=validation_dataset,
s3_output_path=S3_OUTPUT_PATH,
role=ROLE_ARN,
# No compute argument: use serverless model customization.
)
trainer.hyperparameters.rollout_n = 8
trainer.hyperparameters.global_batch_size = 128
trainer.hyperparameters.max_epochs = 4
trainer.hyperparameters.learning_rate = 1e-5
trainer.hyperparameters.max_prompt_length = 2048
training_job = trainer.train(wait=False)
奖励函数设计
奖励是确定性的:它检查九类输出格式,并使用 0.5 阈值的模糊匹配来比较预测标签与参考标签。这使得训练信号可验证,而不需要单独的评判模型。
Overall = 0.30 × recall + 0.30 × precision + 0.30 × accuracy + 0.05 × match_quality + 0.05 × formatting
渐进式奖励计划在训练期间有意改变重点。早期迭代优先考虑 recall,以便模型学习不遗漏预期属性。后期迭代增加 precision,以便它学习避免不支持或不必要的标签。这使得业务权衡在奖励中明确,而不是在 prompt 中隐含。
使用 MLflow 和模型包组跟踪运行。记录选定的超参数、奖励权重、指标和模型谱系,以便你可以比较 SFT 和 RLVR 运行并复现选定的模型版本。
在本演练中,训练和推理使用不同的基础设施选择。SFT 和 RLVR 使用 Amazon SageMaker 无服务器模型定制。服务使用 ml.g6.2xlarge 上的 Amazon SageMaker 异步推理端点。这非常适合面向批处理的目录丰富场景,在这些场景中请求可以排队,结果可以写入 Amazon S3。自定义 vLLM 镜像仅用于推理,不用于无服务器训练阶段。
sm_client.create_endpoint_config(
EndpointConfigName=endpoint_config_name,
ProductionVariants=[{
"VariantName": "AllTraffic",
"ModelName": model_name,
"InitialInstanceCount": 1,
"InstanceType": "ml.g6.2xlarge",
}],
AsyncInferenceConfig={
"OutputConfig": {
"S3OutputPath": "s3://amzn-s3-demo-bucket/async-output"
}
},
)
对于生产环境,如果你希望异步端点随队列深度扩展或在空闲时缩减,请添加自动缩放策略。
向异步端点发送 OpenAI 兼容请求。对于更大的 payload,将请求体上传到 Amazon S3 并将 S3 URI 作为 InputLocation 传递,然后轮询返回的 OutputLocation。本演练使用 temperature=0.1 和 max_tokens=1024 以获得稳定的生成。
response = sagemaker_runtime.invoke_endpoint_async(
EndpointName=ENDPOINT_NAME,
ContentType="application/json",
InputLocation=input_location,
)
output_location = response["OutputLocation"]
结果及其对目录工作流的含义
评估表明 SFT 提供了大部分任务适配,而 GRPO 增加了较小的改进,将模型转向更高的覆盖率。下表分离了这些效果,以便你可以解释权衡。
SFT 是主要的质量驱动因素。加权 Overall 分数从 0.354 上升到 0.6827,recall 从 0.327 上升到 0.6689,precision 从 0.397 上升到 0.652。这是直接教授模型任务和模式的效果。
然后 GRPO 做出更窄的权衡。Overall 从 0.6827 增加到 0.6941,recall 从 0.6689 增加到 0.703,而 precision 从 0.652 略微下降到 0.638。对于目录团队,这意味着当遗漏有效属性的成本高于产生少量额外标签时,GRPO 可能有用。如果不必要标签在下游更有害,请调整奖励权重以优先考虑 precision。
这些指标衡量标签质量,而不是直接衡量业务转化。将它们作为模型选择信号,然后使用目录特定指标(如属性完整性、手动更正率、搜索/过滤覆盖率以及下游推荐质量)验证生产影响。
图 2:RLVR 运行中的训练奖励趋势。最终模型选择应使用留出评估指标,而不是仅依赖训练曲线
验证演练后,仅删除为其创建的资源:端点、端点配置、模型、奖励 AWS Lambda 和评估器、数据集版本、模型包组、S3 前缀以及 ECR 推理镜像。删除共享资产前确认资源名称。
当模式稳定、工作负载重复且正确性可以通过编程评分时,产品标签是强烈的定制候选者。在本示例中,Qwen3-8B 通过无服务器 SFT 学习九类格式,然后 RLVR 与 GRPO 使用可验证奖励来调整覆盖率与 precision 之间的平衡。结果并非每个指标都同等改善。相反,奖励设计使期望的目录权衡明确且可衡量。
当任务频繁变化、分类法仍在发展或工作流需要超越固定标签模式的更广泛推理时,前沿模型仍然有用。然而,对于成熟的高容量标签任务,无服务器模型定制为你提供了一条托管路径来专门化开源权重模型,而无需选择训练实例或维护训练容器。
你可以在 GitHub 上通过 Amazon SageMaker Python SDK v3 无服务器模型定制示例来复现和扩展无服务器定制流程,包括 SFT、RLVR、AI Registry 和端到端笔记本。关于服务概念和支持的模型,请参阅 Amazon SageMaker AI 模型定制文档。