

# 使用 Inspect AI 容器评测模型
<a name="nova-eval-inspect-ai-container"></a>

SageMaker Inspect AI 容器依托 SageMaker 训练作业执行大语言模型评测。该容器借助 [Inspect AI](https://inspect.ai-safety-institute.org.uk/)，为部署至 SageMaker 推理端点或 Amazon Bedrock 的模型提供标准化评测流程，支持 Amazon Nova 1.0（Micro、Lite、Pro）与 2.0（Lite 2）系列模型。

以往基于 [lighteval](https://github.com/huggingface/lighteval) 的[评测方案](https://docs.aws.amazon.com//nova/latest/nova2-userguide/nova-model-evaluation.html)将离线推理与评测逻辑深度耦合，限制了模型部署与测试方式的灵活度。Inspect AI 容器将评测逻辑与推理流程完全解耦。

## 概述
<a name="nova-eval-container-overview"></a>

主要优势包括：
+ **自带基准**：按照 Inspect AI 规范编写评测任务，即可接入各类领域专属评测任务，无需依赖集中式团队完成上线流程。
+ **灵活选用推理后端进行评测**：兼容 SageMaker 推理（现有端点或即时创建）、Amazon Bedrock，后续还将支持更多推理后端。
+ **加速迭代流程**：从基准开发到生产环境评测，全程无需调整基础设施。以往耗时数日的全新基准上线工作，如今仅需数分钟即可完成。
+ **支持大规模批量评测**：可在单个作业中串联多项基准，并混用 inspect-evals 库中的标准基准与自定义任务。
+ **统一入口适配各类训练技术**：无论模型采用 SFT（SMTJ、SMHP）、CPT（SMHP）还是 RFT（SMTJ、SMHP）微调，容器均可通过统一接口完成评测。同时支持评测训练中途阶段性保存的检查点（例如第 500 步、第 1000 步生成的检查点），只需将 `model_s3_uri` 指向对应检查点路径即可。

### 工作原理
<a name="nova-eval-container-how-it-works"></a>

向容器传入两类输入资源：

1. 用于定义推理服务提供方、基准及评测参数的 YAML 配置文件（配方）

1. 已上传至 Amazon S3 的基准文件（搭载 `@task` 装饰器的 Python 脚本）

容器统一完成端点管理、评测执行与结果汇总。训练作业运行完毕后，评测结果将写入您指定的 S3 输出路径。

## 容器映像
<a name="nova-eval-container-images"></a>

下表按 AWS 区域列出了 Inspect AI 容器映像 URI。


| 区域 | 容器映像 URI | 
| --- | --- | 
| us-east-1 | 763104351884.dkr.ecr.us-east-1.amazonaws.com/sagemaker-inspect-ai:latest | 
| us-west-2 | 763104351884.dkr.ecr.us-west-2.amazonaws.com/sagemaker-inspect-ai:latest | 
| eu-west-2 | 763104351884.dkr.ecr.eu-west-2.amazonaws.com/sagemaker-inspect-ai:latest | 

## 先决条件
<a name="nova-eval-container-prerequisites"></a>

开始前，请确保已具备以下资源与权限。


| 要求 | 说明 | 
| --- | --- | 
| 具备 SageMaker 访问权限的 AWS 账户 | 拥有创建 SageMaker 训练作业权限的有效 AWS 账户 | 
| S3 存储桶 | 用于存放评测配方、基准文件及输出结果的存储桶 | 
| IAM 执行角色 | SageMaker 可担任该角色以访问您资源 | 
| SageMaker 推理端点或 Amazon Bedrock 访问权限 | 已部署的模型端点，或该模型的 Amazon Bedrock 访问权限 | 
| AWS CLI 或 SageMaker Python SDK | 用于提交训练作业、管理各类资源的工具 | 
| 容量预留（大模型） | 若模型需使用加速型实例（如运行 Nova Lite 2 所需的 p5 实例），请联系 AWS Support 为 SageMaker 推理或 Amazon Bedrock 预留容量 | 

## 步骤 1：设置 IAM 权限
<a name="nova-eval-container-step1"></a>

SageMaker 训练作业将使用您指定的执行角色运行。该角色需具备以下权限：从 S3 读取基准文件、写入评测结果、调用推理端点，以及输出 CloudWatch 日志。

**1.1 创建信任策略**

将以下内容保存为 `trust_policy.json`：

```
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "sagemaker.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
```

**1.2 创建角色**

```
aws iam create-role \
  --role-name InspectLensEvalRole \
  --assume-role-policy-document file://trust_policy.json
```

**1.3 附加权限策略**

将以下内容保存为 `eval_policy.json`，将所有占位符值（`REGION`、`ACCOUNT_ID`、存储桶名称）替换为实际值：

```
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "S3ReadBenchmarkData",
      "Effect": "Allow",
      "Action": ["s3:GetObject", "s3:ListBucket"],
      "Resource": [
        "arn:aws:s3:::YOUR_BENCHMARK_BUCKET",
        "arn:aws:s3:::YOUR_BENCHMARK_BUCKET/*"
      ]
    },
    {
      "Sid": "S3WriteResults",
      "Effect": "Allow",
      "Action": ["s3:GetObject", "s3:PutObject", "s3:ListBucket"],
      "Resource": [
        "arn:aws:s3:::YOUR_RESULTS_BUCKET",
        "arn:aws:s3:::YOUR_RESULTS_BUCKET/*"
      ]
    },
    {
      "Sid": "SageMakerInvokeExistingEndpoint",
      "Effect": "Allow",
      "Action": [
        "sagemaker:InvokeEndpoint",
        "sagemaker:InvokeEndpointWithResponseStream",
        "sagemaker:DescribeEndpoint"
      ],
      "Resource": "arn:aws:sagemaker:REGION:ACCOUNT_ID:endpoint/*"
    },
    {
      "Sid": "BedrockInference",
      "Effect": "Allow",
      "Action": [
        "bedrock:InvokeModel",
        "bedrock:InvokeModelWithResponseStream"
      ],
      "Resource": [
        "arn:aws:bedrock:REGION::foundation-model/*",
        "arn:aws:bedrock:REGION:ACCOUNT_ID:inference-profile/*",
        "arn:aws:bedrock:REGION:ACCOUNT_ID:provisioned-model/*",
        "arn:aws:bedrock:REGION:ACCOUNT_ID:custom-model/*",
        "arn:aws:bedrock:REGION:ACCOUNT_ID:imported-model/*",
        "arn:aws:bedrock:REGION:ACCOUNT_ID:custom-model-deployment/*"
      ]
    },
    {
      "Sid": "BedrockCustomModelAccess",
      "Effect": "Allow",
      "Action": [
        "bedrock:GetCustomModel",
        "bedrock:GetImportedModel",
        "bedrock:GetProvisionedModelThroughput",
        "bedrock:GetCustomModelDeployment",
        "bedrock:GetInferenceProfile"
      ],
      "Resource": [
        "arn:aws:bedrock:REGION:ACCOUNT_ID:custom-model/*",
        "arn:aws:bedrock:REGION:ACCOUNT_ID:imported-model/*",
        "arn:aws:bedrock:REGION:ACCOUNT_ID:provisioned-model/*",
        "arn:aws:bedrock:REGION:ACCOUNT_ID:custom-model-deployment/*",
        "arn:aws:bedrock:REGION:ACCOUNT_ID:inference-profile/*"
      ]
    },
    {
      "Sid": "SageMakerCreateEndpointLifecycle",
      "Effect": "Allow",
      "Action": [
        "sagemaker:CreateModel",
        "sagemaker:DescribeModel",
        "sagemaker:DeleteModel",
        "sagemaker:CreateEndpointConfig",
        "sagemaker:DescribeEndpointConfig",
        "sagemaker:DeleteEndpointConfig",
        "sagemaker:CreateEndpoint",
        "sagemaker:DescribeEndpoint",
        "sagemaker:DeleteEndpoint",
        "sagemaker:InvokeEndpoint",
        "sagemaker:InvokeEndpointWithResponseStream"
      ],
      "Resource": [
        "arn:aws:sagemaker:REGION:ACCOUNT_ID:model/inspectlens-*",
        "arn:aws:sagemaker:REGION:ACCOUNT_ID:endpoint/inspectlens-*",
        "arn:aws:sagemaker:REGION:ACCOUNT_ID:endpoint-config/inspectlens-*"
      ]
    },
    {
      "Sid": "ECRAuth",
      "Effect": "Allow",
      "Action": "ecr:GetAuthorizationToken",
      "Resource": "*"
    },
    {
      "Sid": "PassRoleToSageMaker",
      "Effect": "Allow",
      "Action": "iam:PassRole",
      "Resource": "arn:aws:iam::ACCOUNT_ID:role/InspectLensEvalRole",
      "Condition": {
        "StringEquals": {
          "iam:PassedToService": "sagemaker.amazonaws.com"
        }
      }
    },
    {
      "Sid": "VPCNetworkingForEndpoint",
      "Effect": "Allow",
      "Action": [
        "ec2:CreateNetworkInterface",
        "ec2:CreateNetworkInterfacePermission",
        "ec2:DeleteNetworkInterface",
        "ec2:DeleteNetworkInterfacePermission",
        "ec2:DescribeNetworkInterfaces",
        "ec2:DescribeVpcs",
        "ec2:DescribeDhcpOptions",
        "ec2:DescribeSubnets",
        "ec2:DescribeSecurityGroups"
      ],
      "Resource": "*"
    },
    {
      "Sid": "CloudWatchLogs",
      "Effect": "Allow",
      "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:PutLogEvents",
        "logs:DescribeLogStreams"
      ],
      "Resource": [
        "arn:aws:logs:REGION:ACCOUNT_ID:log-group:/aws/sagemaker/TrainingJobs:*",
        "arn:aws:logs:REGION:ACCOUNT_ID:log-group:/aws/sagemaker/Endpoints/*"
      ]
    },
    {
      "Sid": "MLflowTrackingServer",
      "Effect": "Allow",
      "Action": [
        "sagemaker:DescribeMlflowTrackingServer",
        "sagemaker:CreatePresignedMlflowTrackingServerUrl"
      ],
      "Resource": "arn:aws:sagemaker:REGION:ACCOUNT_ID:mlflow-tracking-server/*"
    },
    {
      "Sid": "MLflowTrackingOperations",
      "Effect": "Allow",
      "Action": [
        "sagemaker-mlflow:AccessUI",
        "sagemaker-mlflow:CreateExperiment",
        "sagemaker-mlflow:GetExperiment",
        "sagemaker-mlflow:GetExperimentByName",
        "sagemaker-mlflow:SearchExperiments",
        "sagemaker-mlflow:CreateRun",
        "sagemaker-mlflow:GetRun",
        "sagemaker-mlflow:UpdateRun",
        "sagemaker-mlflow:SearchRuns",
        "sagemaker-mlflow:LogMetric",
        "sagemaker-mlflow:LogParam",
        "sagemaker-mlflow:LogBatch",
        "sagemaker-mlflow:SetTag",
        "sagemaker-mlflow:LogArtifact",
        "sagemaker-mlflow:ListArtifacts"
      ],
      "Resource": "arn:aws:sagemaker:REGION:ACCOUNT_ID:mlflow-tracking-server/*"
    },
    {
      "Sid": "KMSForVolumeEncryption",
      "Effect": "Allow",
      "Action": [
        "kms:Encrypt",
        "kms:Decrypt",
        "kms:GenerateDataKey",
        "kms:CreateGrant",
        "kms:DescribeKey"
      ],
      "Resource": "arn:aws:kms:REGION:ACCOUNT_ID:key/*"
    }
  ]
}
```

将该策略附加到角色：

```
aws iam put-role-policy \
  --role-name InspectLensEvalRole \
  --policy-name InspectLensEvalPolicy \
  --policy-document file://eval_policy.json
```

## 步骤 2：编写评测配方
<a name="nova-eval-container-step2"></a>

评测配方为 YAML 配置文件，用于定义容器执行评测任务的方式。此类配方可指定推理服务提供方、基准、评测参数及输出配置。

如需完整端到端示例，请参阅下述笔记本：
+ [评测现有 SageMaker 端点](https://github.com/aws-samples/amazon-nova-samples/blob/main/customization/sagemaker-inspect-ai/inspect_eval_container/eval_sagemaker_endpoint.ipynb)
+ [通过托管端点进行评测](https://github.com/aws-samples/amazon-nova-samples/blob/main/customization/sagemaker-inspect-ai/inspect_eval_container/eval_managed_endpoint.ipynb)
+ [评测 Amazon Bedrock 模型](https://github.com/aws-samples/amazon-nova-samples/blob/main/customization/sagemaker-inspect-ai/inspect_eval_container/eval_bedrock_model.ipynb)

**方案 A：评测现有 SageMaker 端点**

若模型已部署至 SageMaker 推理端点，则选用此方案。

```
inference_provider:
  sagemaker_endpoint:
    endpoint_name: "my-existing-endpoint"
    region: "us-east-1"

benchmarks:
  s3_path: "s3://your-bucket/benchmarks/my_benchmarks/"
  tasks:
    - name: mmlu

eval:
  max_connections: 10
  max_retries: 100
  timeout: 600

output:
  s3_path: "s3://your-bucket/eval-results/"
```

**方案 B：创建端点、执行评测、清理资源**

选择该方选择该方案时，容器会自动部署 Amazon Nova 基础模型或经过微调的模型、运行评测，并在评测完成后删除端点。该方式推荐用于单次临时评测任务。您可前往 [Amazon Nova SageMaker 推理容器映像](https://docs.aws.amazon.com//nova/latest/userguide/nova-model-sagemaker-inference.html#nova-sagemaker-inference-container-images)文档，获取最新版 SageMaker 推理容器。

```
inference_provider:
  sagemaker_endpoint:
    endpoint_name: null                 # null = create new endpoint
    model_s3_uri: "s3://your-bucket/models/nova-micro/"
    inference_image_uri: "708977205387.dkr.ecr.us-east-1.amazonaws.com/nova-inference-repo:SM-Inference-latest"
    instance_type: "ml.p5.48xlarge"
    instance_count: 1
    execution_role_arn: "arn:aws:iam::ACCOUNT_ID:role/InspectLensEvalRole"
    region: "us-east-1"
    context_length: "16000"
    max_concurrency: "32"
    cleanup_endpoint: true              # Auto-delete after eval

benchmarks:
  s3_path: "s3://your-bucket/benchmarks/my_benchmarks/"
  tasks:
    - name: mmlu_pro
    - name: arc_c
    - name: boolq

eval:
  fail_on_error: false
  decoding:
    temperature: 0.0
    top_p: 1.0
    top_k: -1
    max_tokens: 16000
    reasoning_effort: null
  max_connections: 16
  max_retries: 100
  timeout: 600
  extra_args:
    - "-M"
    - "completion_mode=True"
    - "--logprobs"
    - "--top-logprobs"
    - "5"

output:
  s3_path: "s3://your-bucket/eval-results/"
```

**关于 `model_s3_uri` 的说明：**
+ **Amazon Nova 正式发布版基础模型（基础检查点）**：示例路径 `s3://escrow-nova-model-708977205387-us-east-1/nova-lite-2/prod/` – SageMaker 自动管理访问权限，无需额外配置 S3 权限。
+ **Amazon Nova 自定义模型（训练后检查点）**：示例路径 `s3://customer-escrow-ACCOUNT_ID-SUFFIX/YOUR_RUN_NAME/outputs/checkpoints/step_N/` – 该路径为训练作业输出所在的存储桶路径。

**方案 C：通过 Amazon Bedrock 执行评测**

若可通过 Amazon Bedrock 评测模型，则选用此方案，无需维护端点。

```
inference_provider:
  bedrock:
    model_id: amazon.nova-pro-v1:0
    region: us-east-1

benchmarks:
  - name: mmlu
    path: benchmarks/mmlu_pro.py
    limit: 100

eval:
  fail_on_error: false
  decoding:
    temperature: 0.0
    top_p: 1.0
    top_k: -1
    max_tokens: 8192
    reasoning_effort: null
  max_connections: 10
  max_retries: 50
  timeout: 600
  extra_args:
    - "--display"
    - "plain"

output:
  s3_path: s3://your-bucket/eval/output/
```

**基准配置**

`benchmarks` 段用于指定待执行的评测任务，支持在单个作业内串联多项基准。


| 字段 | 必填 | 默认值 | Description | 
| --- | --- | --- | --- | 
| name | 是 | — | 本次基准运行的自定义标识名称 | 
| path | 是 | — | 基准 Python 文件在 S3 基准目录下的相对路径 | 
| limit | 否 | 无限制（全部样本） | 参与评测的最大样本数量。可用于完整运行前的调试测试。 | 
| epochs | 否 | 1 | 评测重复执行次数，用于保障统计显著性 | 
| task\_args | 否 | — | 传入基准任务函数的键值对参数 | 

**评测配置**

`eval` 段用于控制容器执行评测任务的方式。


| 参数 | 必填 | 默认值 | 说明 | 
| --- | --- | --- | --- | 
| fail\_on\_error | 否 | false | 存在样本评测失败时，终止整体评测。如需严格校验可设置为 true。 | 
| max\_connections | 否 | 10 | 向推理端点发起的并行请求数 | 
| max\_retries | 否 | 3 | 推理请求失败后的最大重试次数 | 
| timeout | 否 | 600 | 单次推理调用的请求超时时间（单位：秒） | 
| extra\_args | 否 | — | 直接传递至 Inspect AI 评测命令的额外键值对参数 | 

**解码参数**

可在 `eval.decoding` 段中设置模型生成解码相关参数：


| 参数 | 必填 | 默认值 | 说明 | 
| --- | --- | --- | --- | 
| temperature | 否 | 0.0 | 控制生成内容的随机性。设置为 0.0 可得到确定、可复现的基准结果。 | 
| top\_p | 否 | 1.0 | 核采样阈值。设置为 1.0 代表不施加限制。 | 
| top\_k | 否 | –1 | 仅限概率最高的前 K 个词元作为候选。设置为 -1 代表关闭该过滤规则。 | 
| max\_tokens | 否 | 8192 | 单次响应可生成的最大词元数量。若基准任务需要超长推理链路，可调高该数值。 | 
| reasoning\_effort | 否 | null | 为支持该功能的模型设置推理深度（例如具备扩展思考能力的 Amazon Nova 系列模型）。可选值：low、high；设置为 null 代表关闭该功能。 | 

**输出配置**

`output` 段用于定义评测结果的存储路径与存储方式。


| 字段 | 必填 | 默认值 | Description | 
| --- | --- | --- | --- | 
| s3\_path | 是 | — | 用于写入评测结果的 S3 URI 地址 | 
| output\_format | 否 | eval | 结果文件存储格式。可选类型见下表。 | 

支持以下输出格式：


| Format | 说明 | 
| --- | --- | 
| eval | Inspect AI 原生格式。可通过 inspect view 工具开展交互式分析。 | 
| csv | 逗号分隔值文件。适用于表格分析与数据管道处理。 | 
| jsonl | JSON Lines 格式。每行包含一个 JSON 对象，适配流式处理场景。 | 
| json | 标准 JSON 格式。完整结果存储为单一结构化文件。 | 

**MLflow 配置**

您可选择将评测指标记录至 MLflow 跟踪服务器。在配方中新增 `tracking` 段：

```
tracking:
  mlflow_tracking_arn: null       # ARN of SageMaker MLflow tracking server
  mlflow_experiment_name: "inspectlens" # experiment name
  mlflow_tracing: true          # log full request/response traces
  mlflow_log_artifacts: true       # upload .eval files to MLflow
```


| 字段 | 必填 | 默认值 | 说明 | 
| --- | --- | --- | --- | 
| mlflow\_tracking\_arn | 否 | null | SageMaker MLflow 跟踪服务器对应的 ARN。配置该参数后将开启 MLflow 日志记录功能。若省略或设置为 null，则表示关闭该功能。 | 
| mlflow\_experiment\_name | 否 | inspectlens | 用于记录运行记录的 MLflow 实验名称。 | 
| mlflow\_tracing | 否 | true | 设置为 true 时，会记录每条样本完整的请求与响应日志。 | 
| mlflow\_log\_artifacts | 否 | true | 设置为 true 时，会将 .eval 日志文件上传为 MLflow 构件。 | 

**完整配方参考**

下方示例展示包含全部可用配置项的完整评测配方：

```
inference_provider:
  sagemaker_endpoint:
    endpoint_name: my-nova-endpoint
    model_s3_uri: s3://your-bucket/models/my-model/
    inference_image_uri: "708977205387.dkr.ecr.us-east-1.amazonaws.com/nova-inference-repo:SM-Inference-latest"
    instance_type: ml.g5.12xlarge
    cleanup_endpoint: true
    region: us-west-2

benchmarks:
  - name: mmlu
    path: benchmarks/mmlu_pro.py
    limit: 100
    epochs: 3
    task_args:
      subject: math
  - name: truthfulqa
    path: benchmarks/truthfulqa.py
    limit: 50

eval:
  fail_on_error: false
  decoding:
    temperature: 0.0
    top_p: 1.0
    top_k: -1
    max_tokens: 8192
    reasoning_effort: null
  max_connections: 256
  max_retries: 50
  timeout: 600
  extra_args:
    - "--display"
    - "plain"

output:
  s3_path: s3://your-bucket/eval/output/
  output_format: eval

tracking:
  mlflow_tracking_arn: "arn:aws:sagemaker:us-west-2:123456789012:mlflow-tracking-server/my-server"
  mlflow_experiment_name: "inspectlens"
  mlflow_tracing: true
  mlflow_log_artifacts: true
```

## 步骤 3：准备基准文件
<a name="nova-eval-container-step3"></a>

基准为通过 Inspect AI `@task` 的装饰器定义评测任务的 Python 文件。[inspect-evals 存储库](https://github.com/UKGovernmentBEIS/inspect_evals)提供 128 种以上开箱即用的基准，您也可自行开发自定义基准。

**基准示例**

下方为最简基准示例，用于评测 HuggingFace 数据集上的模型选择题作答效果：

```
from inspect_ai import task, Task
from inspect_ai.dataset import hf_dataset
from inspect_ai.scorer import choice
from inspect_ai.solver import multiple_choice


@task
def my_benchmark():
    return Task(
        dataset=hf_dataset(
            path="cais/mmlu",
            name="abstract_algebra",
            split="test",
        ),
        solver=multiple_choice(),
        scorer=choice(),
    )
```

**依赖项**

若您基准需要额外依赖项，请在同一 S3 目录中放置 `pyproject.toml` 或 `requirements.txt`：

```
[project]
name = "my-benchmark"
version = "0.1.0"
requires-python = ">=3.12"
dependencies = [
    "datasets>=2.14.0",
]
```

**预装软件包**

容器已内置下述软件包。无需在 `pyproject.toml` 中重复列出。


| 软件包 | 版本 | 
| --- | --- | 
| Python | 3.12 | 
| inspect-ai | 0.3.220 | 
| boto3 | 1.40.61 | 
| aioboto3 | 15.5.0 | 
| openai | 2.36.0 | 
| mlflow | 3.12.0 | 
| pyyaml | 6.0.3 | 

**任务选择**

配方中的 `tasks` 字段用于控制基准文件内需要执行的评测任务。


| 配置 | 示例 | 行为 | 
| --- | --- | --- | 
| 空 tasks | tasks: [] | 运行该基准文件中定义的全部任务 | 
| 名称筛选 | tasks: ["algebra"] | 运行名称包含子串“algebra”的任务 | 
| limit | limit: 50 | 限制单任务参与评测的最大样本数 | 
| epochs | epochs: 3 | 多次重复执行评测，用于测算结果波动幅度 | 

## 步骤 4：规划 S3 目录结构
<a name="nova-eval-container-step4"></a>

以下目录结构为推荐规范，便于统一管理配置文件、基准与结果。您可将容器指向任意 S3 路径，该目录结构并非强制要求。

```
s3://your-bucket/
├── config/
│   └── inspect_config.yaml       # Your eval recipe
├── benchmarks/
│   └── my_benchmarks/            # Your benchmark Python files
│       ├── pyproject.toml        # Optional: benchmark dependencies
│       ├── my_task.py            # @task decorated functions
│       └── _helpers.py           # Shared utilities
└── output/                       # Results written here
```

将文件上传到 S3：

```
# Upload benchmark files
aws s3 cp my_benchmarks/ s3://your-bucket/benchmarks/my_benchmarks/ --recursive

# Upload your eval recipe
aws s3 cp inspect_config.yaml s3://your-bucket/config/inspect_config.yaml
```

## 步骤 5：提交训练作业
<a name="nova-eval-container-step5"></a>

提交 SageMaker 训练作业执行评测任务。可通过 AWS CLI 或 SageMaker Python SDK 完成操作。

**方案 A：AWS CLI**

```
aws sagemaker create-training-job \
    --training-job-name inspect-eval-$(date +%Y%m%d-%H%M%S) \
    --algorithm-specification \
        TrainingImage=763104351884.dkr.ecr.us-east-1.amazonaws.com/sagemaker-inspect-ai:latest,TrainingInputMode=File \
    --role-arn arn:aws:iam::123456789012:role/SageMakerInspectAIRole \
    --resource-config \
        InstanceType=ml.m5.large,InstanceCount=1,VolumeSizeInGB=30 \
    --stopping-condition MaxRuntimeInSeconds=86400 \
    --input-data-config '[
        {
            "ChannelName": "config",
            "DataSource": {
                "S3DataSource": {
                    "S3DataType": "S3Prefix",
                    "S3Uri": "s3://your-bucket/eval/config/",
                    "S3DataDistributionType": "FullyReplicated"
                }
            }
        }
    ]' \
    --output-data-config S3OutputPath=s3://your-bucket/eval/output/ \
    --region us-west-2
```

**方案 B：SageMaker Python SDK V3**

```
from sagemaker.train import ModelTrainer
from sagemaker.train.configs import InputData, Compute
from sagemaker.core.shapes.shapes import StoppingCondition, OutputDataConfig

trainer = ModelTrainer(
    training_image="763104351884.dkr.ecr.us-east-1.amazonaws.com/sagemaker-inspect-ai:latest",
    compute=Compute(
        instance_type="ml.m5.large",
        instance_count=1,
        volume_size_in_gb=30,
    ),
    output_data_config=OutputDataConfig(
        s3_output_path="s3://your-bucket/eval/output/"
    ),
    role="arn:aws:iam::123456789012:role/SageMakerInspectAIRole",
    stopping_condition=StoppingCondition(max_runtime_in_seconds=86400),
)

trainer.train(
    input_data_config=[
        InputData(
            channel_name="config",
            data_source="s3://your-bucket/eval/config/",
        )
    ]
)
```

**关键参数**


| 参数 | 值 | 说明 | 
| --- | --- | --- | 
| TrainingImage | 763104351884.dkr.ecr.us-east-1.amazonaws.com/sagemaker-inspect-ai:latest | Inspect AI 容器映像 | 
| InstanceType | ml.m5.large | 编排工具实例类型（非推理实例） | 
| VolumeSizeInGB | 30 | 基准数据与日志存储空间 | 
| MaxRuntimeInSeconds | 86400 | 作业最长运行时长（24 小时） | 
| ChannelName | config | 存放评测配方与基准文件的输入通道 | 

**编排工具实例类型选型说明**

训练作业实例仅负责运行评测编排逻辑，不承载模型推理任务。请根据评测工作负载选择实例类型。


| 实例类型 | 使用案例 | 选型说明 | 
| --- | --- | --- | 
| ml.m5.large | 默认推荐 | 可满足大多数中等并发规模的评测工作负载 | 
| ml.m5.4xlarge | 大规模基准套件 | 适用于运行大量基准且 max\_connections 取值较高的场景 | 
| ml.c5.large | 成本敏感型场景 | 低成本备选方案，适合并发量低的轻量级评测任务 | 

**环境变量**

可向容器传入环境变量，用于身份验证或参数配置。向 AWS CLI 命令添加 `--environment` 参数：

```
aws sagemaker create-training-job \
    ...
    --environment '{
        "HF_TOKEN": "hf_your_token_here",
        "HF_HUB_DOWNLOAD_TIMEOUT": "300"
    }'
```

## 步骤 6：监控作业
<a name="nova-eval-container-step6"></a>

提交训练作业后，可通过 AWS CLI 或 CloudWatch Logs 查看作业运行进度。

**查看作业状态**

```
aws sagemaker describe-training-job \
    --training-job-name your-job-name \
    --query "TrainingJobStatus" \
    --output text
```

**流式查看日志**

```
aws logs tail /aws/sagemaker/TrainingJobs \
    --log-stream-name-prefix your-job-name \
    --follow
```

**日志输出内容说明**

容器日志会依次展示以下运行阶段的进度信息：

1. **容器启动**阶段：容器初始化与配置验证

1. **基准下载**阶段：下载基准文件并安装依赖项

1. **端点准备**阶段：创建或连接至推理端点

1. **评测执行**阶段：运行各项基准任务并输出进度指示

1. **结果上传**阶段：将评测结果写入 S3，并可同步记录至 MLflow

1. **资源清理**阶段：若 `cleanup_endpoint: true`，自动删除临时端点

**预计耗时**


| 暂存区 | 预计时长 | 
| --- | --- | 
| 容器启动 | 2–5 分钟 | 
| 创建端点（如适用） | 15 – 30 分钟 | 
| 评估 | 视基准规模与模型推理延迟而定 | 
| 资源清理 | 1–2 分钟 | 

## 步骤 7：查看并解读结果
<a name="nova-eval-container-step7"></a>

作业运行完成后，可查看评测结果。

**通过 Inspect AI 查看结果**

借助 Inspect AI 可视化工具，直接读取 S3 中的结果文件并交互式分析：

```
inspect view --log-dir s3://your-bucket/eval-results/
```

执行该命令后会打开本地 Web 界面，可查看各项得分、单条样本，以及多轮评测结果对比。

**下载并分享**

将结果下载至本地：

```
aws s3 cp s3://your-bucket/eval/output/ ./results/ --recursive

INSPECT_LOG_DIR=./results inspect view
```

**VS Code 扩展**

[Inspect AI VS Code 扩展](https://inspect.aisi.org.uk/vscode.html)支持直接读取 S3 中的评测日志，无需预先下载文件。

1. 通过 VS Code 应用市场安装插件（搜索关键词 Inspect AI）

1. 在 Inspect 侧边活动栏打开“日志”面板，点击文件夹图标

1. 填入 S3 存储路径：`s3://your-bucket/eval-results/`

**输出结构**

每次评测会生成一份 `.eval` 日志文件，内含以下模块：
+ `results.scores`：各指标的汇总得分
+ `samples`：单条评测样本，包含输入、模型输出与对应得分
+ `stats`：运行时统计数据，含词元消耗与推理延迟
+ `eval.config`：本次评测任务使用的完整配置

**通过 MLflow 查看结果（可选）**

若已在配方中配置 MLflow，可执行以下命令生成预签名 URL 以访问跟踪服务器：

```
aws sagemaker create-presigned-mlflow-tracking-server-url \
    --tracking-server-name my-server \
    --region us-west-2
```

将命令返回的 URL 在浏览器打开，即可查看评测指标、对比多轮任务、分析多批次评测的数据趋势。

## 可用基准
<a name="nova-eval-container-benchmarks"></a>

Inspect AI 容器可兼容所有采用 Inspect AI 任务规范编写的基准。[inspect-evals 存储库](https://github.com/UKGovernmentBEIS/inspect_evals)提供 128 种以上开箱即用的基准，覆盖推理能力、知识问答、代码生成、安全对齐等评测领域。

如需自定开发基准，请参阅 [Inspect AI 任务开发文档](https://inspect.aisi.org.uk/tasks.html)。若有公开基准数据集尚未收录至 inspect-evals，您可借助[人工智能助手引导提示](https://github.com/aws-samples/amazon-nova-samples/blob/main/customization/sagemaker-inspect-ai/ai_assisted_benchmark_creation.md)，将其转换为 Inspect AI 标准格式。

## 代理式评测
<a name="nova-eval-container-agentic"></a>

代理式基准用于测试模型完成多步骤任务的能力，这类任务需要调用工具、制定规划并开展迭代式推理。此类评测会模拟真实业务场景，模型在场景中需调用工具、解析返回结果并规划后续操作。

**端点要求**

执行代理式评测时，推理端点必须具备以下能力：
+ **工具调用**：端点需支持函数调用，使模型可在评测流程中调用各类工具
+ **大容量上下文窗口**：包含工具返回结果的多轮对话，需要充足上下文长度以留存完整对话历史

**SageMaker 推理端点配置**

若使用 SageMaker 推理端点执行代理式评测，需在端点上配置以下环境变量：


| 环境变量 | 值 | 说明 | 
| --- | --- | --- | 
| ENABLE\_TOOL\_CALLING | True | 开启推理端点的工具调用功能 | 
| CONTEXT\_LENGTH | 适配多轮对话的充足数值 | 设置足够大的数值，容纳包含工具返回结果的多轮对话内容 | 

如需了解如何在 SageMaker 推理部署 Amazon Nova 端点，请参阅[在 SageMaker 上部署 Amazon Nova 模型](https://docs.aws.amazon.com//nova/latest/userguide/deploy-sagemaker.html)。关于容器功能与相关配置说明，请参阅[容器功能](https://docs.aws.amazon.com//nova/latest/userguide/container-features.html)。

**Amazon Bedrock 端点**

兼容模型的 Amazon Bedrock 端点原生支持工具调用功能。有关更多信息，请参阅 [Amazon Bedrock 工具调用](https://docs.aws.amazon.com//bedrock/latest/userguide/tool-use.html)。

**代理式评测入门**

执行代理式评测前，需完成以下前提条件：

1. 部署已开启工具调用能力的推理端点

1. 从 [inspect-evals 存储库](https://github.com/UKGovernmentBEIS/inspect_evals)选取代理式基准（筛选搭载工具调用求解器的基准）

1. 在配方中，为多轮交互设置适配的 `timeout` 与 `max_tokens`

**Amazon Bedrock 端点**
+ 有关完整部署与配置说明，请参阅 [Amazon Bedrock 端点](https://docs.aws.amazon.com//bedrock/latest/userguide/endpoints.html)。
+ 有关工具调用支持，请参阅[与 Amazon Bedrock 配合使用的工具](https://docs.aws.amazon.com//bedrock/latest/userguide/tool-use.html)中的客户端工具调用部分。有关工具调用支持说明，请参阅 Amazon Bedrock 工具调用中的客户端工具调用部分。

**示例笔记本**

以下笔记本演示如何通过 Inspect AI 容器运行具备工具调用能力的代理式基准：
+ [tau-bench](https://github.com/aws-samples/amazon-nova-samples/blob/main/customization/sagemaker-inspect-ai/inspect_eval_container/eval_tau_bench.ipynb)（基于训练作业）：使用 Inspect AI 容器，在客服任务场景下评测模型结合工具调用后的推理能力

若代理式基准需要 Docker 沙盒环境，请使用 Inspect AI SDK：
+ [SWE-bench \+ Inspect AI SDK](https://github.com/aws-samples/amazon-nova-samples/blob/main/customization/sagemaker-inspect-ai/local_inspect_sdk/eval_swe_bench.ipynb)：通过 Docker 沙盒评测软件工程能力

**重要**  
依赖 Docker 沙盒环境的代理式基准（例如 SWE-bench）无法在 Inspect AI 容器运行流程中使用。SageMaker 训练作业环境不支持 Docker 嵌套运行能力。如需执行此类基准，请在具备 Docker 访问权限的计算环境中使用 [Inspect AI SDK](nova-eval-on-sagemaker-inference.md)（例如 Amazon EC2 实例、预装 Docker 的 SageMaker 笔记本）。

## 问题排查
<a name="nova-eval-container-troubleshooting"></a>

此部分提供使用 Inspect AI 容器执行评测时常见问题的解决办法。

**快速迭代技巧**

在提交 SageMaker 训练作业前，可通过 Inspect AI SDK 在本地调试基准。在本地设备执行 `inspect eval my_benchmark.py` 命令，提前校验任务定义、依赖项及评分逻辑，再大规模运行任务。

**InsufficientInstanceCapacity 错误**

该错误表示 AWS 在当前区域无充足容量供应所请求的实例类型。
+ 更换实例类型，或切换至其他 AWS 区域提交作业
+ 选用其他实例类型（例如使用 `ml.m5.xlarge` 替代 `ml.m5.large`）
+ 等待数分钟后重新提交任务

**AccessDenied 错误**

若训练作业因访问被拒而失败，请逐项核查以下内容：
+ 作业配置中的角色 ARN 填写无误
+ 信任策略允许 `sagemaker.amazonaws.com` 担任该角色
+ 用户或角色具备执行角色的 `iam:PassRole` 权限
+ 执行角色拥有访问 S3 存储桶、推理端点或 Amazon Bedrock 模型的权限

**端点创建失败**

当配置 `cleanup_endpoint: true` 并开启自动创建推理端点时，可能出现以下问题：


| 错误 | 解决方案 | 
| --- | --- | 
| ResourceLimitExceeded | 提交服务配额提升申请，扩容当前区域对应推理实例类型的服务配额 | 
| OutOfMemoryError | 更换更高配置的推理实例类型，或缩减模型大小 | 
| Wrong model\_s3\_uri | 确认 S3 路径指向合法的模型构件目录 | 
| Wrong inference image URI | 确认映像 URI 适配当前区域与模型框架 | 
| Endpoint stuck in Creating | 在 CloudWatch Logs 中查看端点的日志。模型可能未通过运行状况检查。若端点需要更长时间，调大 MaxRuntimeInSeconds 的数值。 | 

**HuggingFace 下载超时**

若基准从 HuggingFace Hub 下载数据集时出现超时，调大环境变量 `HF_HUB_DOWNLOAD_TIMEOUT` 的数值（单位：秒）：

```
--environment '{"HF_HUB_DOWNLOAD_TIMEOUT": "600"}'
```

**作业终止但端点仍在运行**

若训练作业在资源清理流程完成前被中断，推理端点会持续占用资源。请手动删除端点，避免持续产生费用：

```
# List endpoints to find the orphaned one
aws sagemaker list-endpoints \
    --name-contains inspect \
    --query "Endpoints[].EndpointName" \
    --output table

# Delete the endpoint
aws sagemaker delete-endpoint \
    --endpoint-name your-endpoint-name

# Delete the endpoint configuration
aws sagemaker delete-endpoint-config \
    --endpoint-config-name your-endpoint-name

# Delete the model
aws sagemaker delete-model \
    --model-name your-endpoint-name
```

**基准依赖冲突**

若基准因与预装软件包存在依赖冲突而运行失败，可在基准目录新建 `pyproject.toml` 文件，明确限定各依赖项版本。容器会隔离安装基准所需依赖项，最大限度减少版本冲突。

**评测得分异常**

若评测得分偏低或结果波动不一致，请检查评测配方中的如下参数：
+ **temperature**：如需确定、可复现的输出结果，请设置为 `0.0`
+ **max\_tokens**：确保数值足够大，能够支撑模型输出完整响应
+ **completion\_mode**：基础（非对话）模型需在配方中设置 `completion_mode: true`，才能使用文本补全式提示词，而非对话格式

## 数据隐私
<a name="nova-eval-container-data-privacy"></a>

评测数据的处理方式取决于您选用的推理服务提供方。

**SageMaker 端点**

若使用 SageMaker 推理端点，所有数据均留存于您的 AWS 账户内。评测提示词与模型响应不会传输到您的账户外，也不会被用于优化 AWS 服务。无需开启退出政策。

**Amazon Bedrock**

若将 Amazon Bedrock 作为推理服务提供方，您的数据将受《AWS 人工智能服务退出政策》约束。如需阻止数据用于迭代优化 AWS 人工智能服务，请在 AWS Organizations 层级启用数据退出政策。有关更多信息，请参阅[人工智能服务退出政策](https://docs.aws.amazon.com//organizations/latest/userguide/orgs_manage_policies_ai-opt-out.html)。


| 推理服务提供方 | 是否需要启用退出 | Details | 
| --- | --- | --- | 
| SageMaker 端点 | 否 | 数据仅留存于您的账户内。不受人工智能退出政策约束。 | 
| Amazon Bedrock | 是 | 需在 Organizations 层级开启 AWS 人工智能服务退出政策，避免数据用于服务改进。 | 