

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# SageMaker Inferensi
<a name="nova-model-sagemaker-inference"></a>

Model Amazon Nova khusus sekarang tersedia pada SageMaker inferensi. Dengan Amazon Nova aktif SageMaker, Anda dapat mulai mendapatkan prediksi, atau kesimpulan, dari model Amazon Nova kustom Anda yang terlatih. SageMaker menyediakan berbagai pilihan infrastruktur dan opsi penerapan model ML untuk membantu memenuhi semua kebutuhan inferensi ML Anda. Dengan SageMaker inferensi, Anda dapat menskalakan penerapan model Anda, mengelola model secara lebih efektif dalam produksi, dan mengurangi beban operasional.

SageMaker memberi Anda berbagai opsi inferensi, seperti titik akhir waktu nyata untuk mendapatkan inferensi latensi rendah, dan titik akhir asinkron untuk kumpulan permintaan. Dengan memanfaatkan opsi inferensi yang sesuai untuk kasus penggunaan Anda, Anda dapat memastikan penerapan dan inferensi model yang efisien. Untuk informasi lebih lanjut tentang SageMaker inferensi, lihat [Menerapkan model untuk](https://docs.aws.amazon.com//sagemaker/latest/dg/deploy-model.html) inferensi.

**penting**  
Hanya model kustom peringkat penuh dan model gabungan LoRa yang didukung pada inferensi. SageMaker Untuk model LoRa yang tidak digabungkan dan model dasar, gunakan Amazon Bedrock.

## Fitur
<a name="nova-sagemaker-inference-features"></a>

Fitur-fitur berikut tersedia untuk model Amazon Nova pada SageMaker inferensi:

**Kemampuan Model**
+ Pembuatan teks

**Penerapan dan Penskalaan**
+ Titik akhir real-time dengan pemilihan instans khusus
+ Auto Scaling — Secara otomatis menyesuaikan kapasitas berdasarkan pola lalu lintas untuk mengoptimalkan biaya dan pemanfaatan GPU. Untuk informasi selengkapnya, lihat [Menskalakan SageMaker Model Amazon secara otomatis](https://docs.aws.amazon.com//sagemaker/latest/dg/endpoint-auto-scaling.html).
+ Dukungan API streaming untuk pembuatan token waktu nyata

**Pemantauan dan Optimalisasi**
+  CloudWatch Integrasi Amazon untuk pemantauan dan peringatan
+ Ketersediaan Optimalisasi latensi sadar zona melalui konfigurasi VPC

**Alat Pengembangan**
+ AWS CLI dukungan - Untuk informasi selengkapnya, lihat [Referensi Perintah AWS CLI](https://docs.aws.amazon.com/cli/latest/reference/sagemaker/) untuk. SageMaker
+  Integrasi notebook melalui dukungan SDK

## Model dan instance yang didukung
<a name="nova-sagemaker-inference-supported"></a>

Saat membuat titik akhir SageMaker inferensi, Anda dapat mengatur dua variabel lingkungan untuk mengonfigurasi penerapan: dan. `CONTEXT_LENGTH` `MAX_CONCURRENCY`
+ `CONTEXT_LENGTH`— Total panjang token maksimum (input\$1output) per permintaan
+ `MAX_CONCURRENCY`— Jumlah maksimum permintaan bersamaan yang akan dilayani titik akhir

Tabel berikut mencantumkan model Amazon Nova yang didukung, jenis instans, dan konfigurasi yang didukung. Nilai MAX\$1CONCURRENCY mewakili konkurensi maksimum yang didukung untuk setiap pengaturan CONTEXT\$1LENGTH:


****  
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/nova/latest/nova2-userguide/nova-model-sagemaker-inference.html)

**catatan**  
Nilai MAX\$1CONCURRENCY yang ditampilkan adalah batas atas untuk setiap pengaturan CONTEXT\$1LENGTH. Anda dapat menggunakan panjang konteks yang lebih rendah dengan konkurensi yang sama, tetapi melebihi nilai ini akan menyebabkan pembuatan SageMaker titik akhir gagal.  
Misalnya, di Amazon Nova Micro dengan ml.g5.12xlarge:  
`CONTEXT_LENGTH=2000`, `MAX_CONCURRENCY=32` → Berlaku
`CONTEXT_LENGTH=8000`, `MAX_CONCURRENCY=32` → Ditolak (batas konkurensi adalah 16 pada panjang konteks 8000)
`CONTEXT_LENGTH=8000`, `MAX_CONCURRENCY=4` → Berlaku
`CONTEXT_LENGTH=8000`, `MAX_CONCURRENCY=16` → Berlaku
`CONTEXT_LENGTH=10000`→ Ditolak (panjang konteks maks adalah 8000 pada contoh ini)

## AWS Wilayah yang Didukung
<a name="nova-sagemaker-inference-regions"></a>

Tabel berikut mencantumkan AWS Wilayah tempat model Amazon Nova tersedia pada SageMaker inferensi:


****  

| Nama wilayah | Kode Wilayah | Ketersediaan | 
| --- | --- | --- | 
| US East (Northern Virginia) | us-east-1 | Available | 
| AS Barat (Oregon) | us-west-2 | Available | 

## Gambar Kontainer yang Didukung
<a name="nova-sagemaker-inference-container-images"></a>

Tabel berikut mencantumkan gambar kontainer URIs untuk model Amazon Nova pada SageMaker inferensi berdasarkan wilayah. Dua tag gambar tersedia untuk setiap wilayah: tag berversi (`v1.0.0`) dan tag terbaru (`SM-Inference-latest`). Untuk penerapan produksi, sebaiknya gunakan tag berversi.


****  

| Region | Gambar Kontainer URIs | 
| --- | --- | 
| us-east-1 | 708977205387.dkr.ecr.us-east-1.amazonaws.com/nova-inference-repo:SM-Inference-latest | 
| us-west-2 | 176779409107.dkr.ecr.us-west-2.amazonaws.com/nova-inference-repo:SM-Inference-latest | 

## Praktik Terbaik
<a name="nova-sagemaker-inference-best-practices"></a>

Untuk praktik terbaik dalam menerapkan dan mengelola model SageMaker, lihat [Praktik Terbaik untuk SageMaker](https://docs.aws.amazon.com//sagemaker/latest/dg/best-practices.html).

## Support
<a name="nova-sagemaker-inference-support"></a>

Untuk masalah dan dukungan dengan model Amazon Nova pada SageMaker inferensi, hubungi AWS Support melalui Konsol atau manajer AWS akun Anda.

**Topics**
+ [Fitur](#nova-sagemaker-inference-features)
+ [Model dan instance yang didukung](#nova-sagemaker-inference-supported)
+ [AWS Wilayah yang Didukung](#nova-sagemaker-inference-regions)
+ [Gambar Kontainer yang Didukung](#nova-sagemaker-inference-container-images)
+ [Praktik Terbaik](#nova-sagemaker-inference-best-practices)
+ [Support](#nova-sagemaker-inference-support)
+ [Memulai](nova-sagemaker-inference-getting-started.md)
+ [Referensi API](nova-sagemaker-inference-api-reference.md)
+ [Evaluasi Model yang Dihosting pada SageMaker Inferensi](nova-eval-on-sagemaker-inference.md)
+ [Penyebaran Model Amazon Nova Forge di deteksi penyalahgunaan SageMaker Inferensi Amazon](nova-sagemaker-inference-abuse-detection.md)

# Memulai
<a name="nova-sagemaker-inference-getting-started"></a>

Panduan ini menunjukkan cara menerapkan model Amazon Nova yang disesuaikan pada titik akhir SageMaker waktu nyata, mengonfigurasi parameter inferensi, dan memanggil model Anda untuk pengujian.

## Prasyarat
<a name="nova-sagemaker-inference-prerequisites"></a>

Berikut ini adalah prasyarat untuk menerapkan model Amazon Nova pada inferensi: SageMaker 
+ Buat Akun AWS - Jika Anda belum memilikinya, lihat [Membuat AWS akun](https://docs.aws.amazon.com//sagemaker/latest/dg/gs-set-up.html#sign-up-for-aws).
+ Izin IAM yang diperlukan - Pastikan pengguna atau peran IAM Anda memiliki kebijakan terkelola berikut ini terlampir:
  + `AmazonSageMakerFullAccess`
  + `AmazonS3FullAccess`
+  SDKs/CLI Versi yang diperlukan - Versi SDK berikut telah diuji dan divalidasi dengan model Amazon Nova pada SageMaker inferensi:
  + SageMaker Python SDK v3.0.0\$1 () untuk pendekatan API berbasis sumber daya `sagemaker>=3.0.0`
  + Boto3 versi 1.35.0\$1 () `boto3>=1.35.0` untuk panggilan API langsung. Contoh dalam panduan ini menggunakan pendekatan ini.
+ Peningkatan kuota layanan - Minta peningkatan kuota SageMaker layanan Amazon untuk jenis instans ML yang akan digunakan untuk titik akhir SageMaker Inferensi (misalnya,). `ml.p5.48xlarge for endpoint usage` Untuk daftar tipe instans yang didukung, lihat [Model dan instance yang didukung](nova-model-sagemaker-inference.md#nova-sagemaker-inference-supported). Untuk meminta kenaikan, lihat [Meminta kenaikan kuota](https://docs.aws.amazon.com//servicequotas/latest/userguide/request-quota-increase.html). Untuk informasi tentang kuota SageMaker instance, lihat [SageMaker titik akhir dan](https://docs.aws.amazon.com//general/latest/gr/sagemaker.html) kuota.

## Langkah 1: Konfigurasikan AWS kredensil
<a name="nova-sagemaker-inference-step1"></a>

Konfigurasikan AWS kredensyal Anda menggunakan salah satu metode berikut:

**Opsi 1: AWS CLI (Disarankan)**

```
aws configure
```

Masukkan kunci AWS akses, kunci rahasia, dan wilayah default Anda saat diminta.

**Opsi 2: file AWS kredensil**

Buat atau edit`~/.aws/credentials`:

```
[default]
aws_access_key_id = YOUR_ACCESS_KEY
aws_secret_access_key = YOUR_SECRET_KEY
```

**Opsi 3: Variabel lingkungan**

```
export AWS_ACCESS_KEY_ID=your_access_key
export AWS_SECRET_ACCESS_KEY=your_secret_key
```

**catatan**  
Untuk informasi selengkapnya tentang AWS kredensyal, lihat [Konfigurasi dan setelan file kredensyal](https://docs.aws.amazon.com//cli/latest/userguide/cli-configure-files.html).

**Inisialisasi klien AWS **

Buat skrip atau buku catatan Python dengan kode berikut untuk menginisialisasi AWS SDK dan memverifikasi kredensialmu:

```
import boto3

# AWS Configuration - Update these for your environment
REGION = "us-east-1"  # Supported regions: us-east-1, us-west-2
AWS_ACCOUNT_ID = "YOUR_ACCOUNT_ID"  # Replace with your AWS account ID

# Initialize AWS clients using default credential chain
sagemaker = boto3.client('sagemaker', region_name=REGION)
sts = boto3.client('sts')

# Verify credentials
try:
    identity = sts.get_caller_identity()
    print(f"Successfully authenticated to AWS Account: {identity['Account']}")
    
    if identity['Account'] != AWS_ACCOUNT_ID:
        print(f"Warning: Connected to account {identity['Account']}, expected {AWS_ACCOUNT_ID}")

except Exception as e:
    print(f"Failed to authenticate: {e}")
    print("Please verify your credentials are configured correctly.")
```

Jika otentikasi berhasil, Anda akan melihat output yang mengonfirmasi ID AWS akun Anda.

## Langkah 2: Buat peran SageMaker eksekusi
<a name="nova-sagemaker-inference-step2"></a>

Peran SageMaker eksekusi adalah peran IAM yang memberikan SageMaker izin untuk mengakses AWS sumber daya atas nama Anda, seperti bucket Amazon S3 untuk artefak model dan untuk pencatatan. CloudWatch 

**Membuat peran eksekusi**

**catatan**  
Membuat peran IAM membutuhkan `iam:CreateRole` dan `iam:AttachRolePolicy` izin. Pastikan pengguna atau peran IAM Anda memiliki izin ini sebelum melanjutkan.

Kode berikut membuat peran IAM dengan izin yang diperlukan untuk menerapkan model khusus Amazon Nova:

```
import json

# Create SageMaker Execution Role
role_name = f"SageMakerInference-ExecutionRole-{AWS_ACCOUNT_ID}"

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

iam = boto3.client('iam', region_name=REGION)

# Create the role
role_response = iam.create_role(
    RoleName=role_name,
    AssumeRolePolicyDocument=json.dumps(trust_policy),
    Description='SageMaker execution role with S3 and SageMaker access'
)

# Attach required policies
iam.attach_role_policy(
    RoleName=role_name,
    PolicyArn='arn:aws:iam::aws:policy/AmazonSageMakerFullAccess'
)

iam.attach_role_policy(
    RoleName=role_name,
    PolicyArn='arn:aws:iam::aws:policy/AmazonS3FullAccess'
)

SAGEMAKER_EXECUTION_ROLE_ARN = role_response['Role']['Arn']
print(f"Created SageMaker execution role: {SAGEMAKER_EXECUTION_ROLE_ARN}")
```

**Menggunakan peran eksekusi yang ada (Opsional)**

Jika Anda sudah memiliki peran SageMaker eksekusi, Anda dapat menggunakannya sebagai gantinya:

```
# Replace with your existing role ARN
SAGEMAKER_EXECUTION_ROLE_ARN = "arn:aws:iam::YOUR_ACCOUNT_ID:role/YOUR_EXISTING_ROLE_NAME"
```

Untuk menemukan SageMaker peran yang ada di akun Anda:

```
iam = boto3.client('iam', region_name=REGION)
response = iam.list_roles()
sagemaker_roles = [role for role in response['Roles'] if 'SageMaker' in role['RoleName']]
for role in sagemaker_roles:
    print(f"{role['RoleName']}: {role['Arn']}")
```

**penting**  
Peran eksekusi harus memiliki hubungan kepercayaan dengan `sagemaker.amazonaws.com` dan izin untuk mengakses Amazon S3 SageMaker dan sumber daya.

Untuk informasi selengkapnya tentang peran SageMaker eksekusi, lihat [SageMaker Peran](https://docs.aws.amazon.com//sagemaker/latest/dg/sagemaker-roles.html).

## Langkah 3: Konfigurasikan parameter model
<a name="nova-sagemaker-inference-step3"></a>

Konfigurasikan parameter penerapan untuk model Amazon Nova Anda. Pengaturan ini mengontrol perilaku model, alokasi sumber daya, dan karakteristik inferensi. Untuk daftar jenis instance yang didukung dan nilai CONTEXT\$1LENGTH dan MAX\$1CONCURRENCY yang didukung untuk masing-masing, lihat. [Model dan instance yang didukung](nova-model-sagemaker-inference.md#nova-sagemaker-inference-supported)

**Parameter yang diperlukan**
+ `IMAGE`: URI gambar kontainer Docker untuk wadah inferensi Amazon Nova. Ini akan disediakan oleh AWS.
+ `CONTEXT_LENGTH`: Panjang konteks model.
+ `MAX_CONCURRENCY`: Jumlah maksimum urutan per iterasi; menetapkan batas pada berapa banyak permintaan pengguna individu (prompt) dapat diproses secara bersamaan dalam satu batch pada GPU. Rentang: bilangan bulat lebih besar dari 0.

**Parameter generasi opsional**
+ `DEFAULT_TEMPERATURE`: Mengontrol keacakan dalam generasi. Rentang: 0,0 hingga 2,0 (0,0 = deterministik, lebih tinggi = lebih acak).
+ `DEFAULT_TOP_P`: Ambang pengambilan sampel nukleus untuk pemilihan token. Rentang: 1e-10 hingga 1.0.
+ `DEFAULT_TOP_K`: Membatasi pemilihan token ke token K teratas yang paling mungkin. Rentang: bilangan bulat -1 atau lebih besar (-1 = tidak ada batas).
+ `DEFAULT_MAX_NEW_TOKENS`: Jumlah maksimum token yang akan dihasilkan sebagai respons (yaitu token keluaran maks). Rentang: bilangan bulat 1 atau lebih besar.
+ `DEFAULT_LOGPROBS`: Jumlah probabilitas log untuk dikembalikan per token. Rentang: bilangan bulat 1 hingga 20.

**Konfigurasikan penerapan Anda**

```
# AWS Configuration
REGION = "us-east-1"  # Must match region from Step 1

# ECR Account mapping by region
ECR_ACCOUNT_MAP = {
    "us-east-1": "708977205387",
    "us-west-2": "176779409107"
}

# Container Image
IMAGE = f"{ECR_ACCOUNT_MAP[REGION]}.dkr.ecr.{REGION}.amazonaws.com/nova-inference-repo:SM-Inference-latest"
print(f"IMAGE = {IMAGE}")

# Model Parameters
CONTEXT_LENGTH = "16000"       # Maximum total context length
MAX_CONCURRENCY = "2"          # Maximum concurrent sequences

# Optional: Default generation parameters (uncomment to use)
DEFAULT_TEMPERATURE = "0.0"   # Deterministic output
DEFAULT_TOP_P = "1.0"         # Consider all tokens
# DEFAULT_TOP_K = "50"        # Uncomment to limit to top 50 tokens
# DEFAULT_MAX_NEW_TOKENS = "2048"  # Uncomment to set max output tokens
# DEFAULT_LOGPROBS = "1"      # Uncomment to enable log probabilities

# Build environment variables for the container
environment = {
    'CONTEXT_LENGTH': CONTEXT_LENGTH,
    'MAX_CONCURRENCY': MAX_CONCURRENCY,
}

# Add optional parameters if defined
if 'DEFAULT_TEMPERATURE' in globals():
    environment['DEFAULT_TEMPERATURE'] = DEFAULT_TEMPERATURE
if 'DEFAULT_TOP_P' in globals():
    environment['DEFAULT_TOP_P'] = DEFAULT_TOP_P
if 'DEFAULT_TOP_K' in globals():
    environment['DEFAULT_TOP_K'] = DEFAULT_TOP_K
if 'DEFAULT_MAX_NEW_TOKENS' in globals():
    environment['DEFAULT_MAX_NEW_TOKENS'] = DEFAULT_MAX_NEW_TOKENS
if 'DEFAULT_LOGPROBS' in globals():
    environment['DEFAULT_LOGPROBS'] = DEFAULT_LOGPROBS

print("Environment configuration:")
for key, value in environment.items():
    print(f"  {key}: {value}")
```

**Konfigurasikan parameter khusus penerapan**

Sekarang konfigurasikan parameter spesifik untuk penerapan model Amazon Nova Anda, termasuk lokasi artefak model dan pemilihan jenis instans.

**Tetapkan pengenal penerapan**

```
# Deployment identifier - use a descriptive name for your use case
JOB_NAME = "my-nova-deployment"
```

**Tentukan lokasi artefak model**

Sediakan URI Amazon S3 tempat artefak model Amazon Nova terlatih Anda disimpan. Ini harus menjadi lokasi keluaran dari pelatihan model atau pekerjaan fine-tuning Anda.

```
# S3 location of your trained Nova model artifacts
# Replace with your model's S3 URI - must end with /
MODEL_S3_LOCATION = "s3://your-bucket-name/path/to/model/artifacts/"
```

**Pilih varian model dan tipe instance**

```
# Configure model variant and instance type
TESTCASE = {
    "model": "lite2",              # Options: micro, lite, lite2
    "instance": "ml.p5.48xlarge"   # Refer to "Supported models and instances" section
}

# Generate resource names
INSTANCE_TYPE = TESTCASE["instance"]
MODEL_NAME = JOB_NAME + "-" + TESTCASE["model"] + "-" + INSTANCE_TYPE.replace(".", "-")
ENDPOINT_CONFIG_NAME = MODEL_NAME + "-Config"
ENDPOINT_NAME = MODEL_NAME + "-Endpoint"

print(f"Model Name: {MODEL_NAME}")
print(f"Endpoint Config: {ENDPOINT_CONFIG_NAME}")
print(f"Endpoint Name: {ENDPOINT_NAME}")
```

**Konvensi penamaan**

Kode secara otomatis menghasilkan nama yang konsisten untuk AWS sumber daya:
+ Nama model: `{JOB_NAME}-{model}-{instance-type}`
+ Konfigurasi Titik Akhir: `{MODEL_NAME}-Config`
+ Nama titik akhir: `{MODEL_NAME}-Endpoint`

## Langkah 4: Buat konfigurasi SageMaker model dan titik akhir
<a name="nova-sagemaker-inference-step4"></a>

Pada langkah ini, Anda akan membuat dua sumber daya penting: objek SageMaker model yang mereferensikan artefak model Amazon Nova Anda, dan konfigurasi titik akhir yang menentukan bagaimana model akan digunakan.

**SageMaker Model**: Objek model yang mengemas gambar kontainer inferensi, lokasi artefak model, dan konfigurasi lingkungan. Ini adalah sumber daya yang dapat digunakan kembali yang dapat digunakan ke beberapa titik akhir.

**Konfigurasi Titik Akhir**: Mendefinisikan setelan infrastruktur untuk penerapan, termasuk jenis instans, jumlah instance, dan varian model. Ini memungkinkan Anda untuk mengelola pengaturan penerapan secara terpisah dari model itu sendiri.

**Buat SageMaker model**

Kode berikut membuat SageMaker model yang mereferensikan artefak model Amazon Nova Anda:

```
try:
    model_response = sagemaker.create_model(
        ModelName=MODEL_NAME,
        PrimaryContainer={
            'Image': IMAGE,
            'ModelDataSource': {
                'S3DataSource': {
                    'S3Uri': MODEL_S3_LOCATION,
                    'S3DataType': 'S3Prefix',
                    'CompressionType': 'None'
                }
            },
            'Environment': environment
        },
        ExecutionRoleArn=SAGEMAKER_EXECUTION_ROLE_ARN,
        EnableNetworkIsolation=True
    )
    print("Model created successfully!")
    print(f"Model ARN: {model_response['ModelArn']}")
    
except sagemaker.exceptions.ClientError as e:
    print(f"Error creating model: {e}")
```

Parameter kunci:
+ `ModelName`: Pengidentifikasi unik untuk model Anda
+ `Image`: URI gambar wadah Docker untuk inferensi Amazon Nova
+ `ModelDataSource`: Lokasi Amazon S3 dari artefak model Anda
+ `Environment`: Variabel lingkungan dikonfigurasi pada Langkah 3
+ `ExecutionRoleArn`: Peran IAM dari Langkah 2
+ `EnableNetworkIsolation`: Setel ke True untuk keamanan yang ditingkatkan (mencegah kontainer melakukan panggilan jaringan keluar)

**Buat konfigurasi titik akhir**

Selanjutnya, buat konfigurasi endpoint yang mendefinisikan infrastruktur deployment Anda:

```
# Create Endpoint Configuration
try:
    production_variant = {
        'VariantName': 'primary',
        'ModelName': MODEL_NAME,
        'InitialInstanceCount': 1,
        'InstanceType': INSTANCE_TYPE,
    }
    
    config_response = sagemaker.create_endpoint_config(
        EndpointConfigName=ENDPOINT_CONFIG_NAME,
        ProductionVariants=[production_variant]
    )
    print("Endpoint configuration created successfully!")
    print(f"Config ARN: {config_response['EndpointConfigArn']}")
    
except sagemaker.exceptions.ClientError as e:
    print(f"Error creating endpoint configuration: {e}")
```

Parameter kunci:
+ `VariantName`: Pengidentifikasi untuk varian model ini (gunakan 'primer' untuk penerapan model tunggal)
+ `ModelName`: Referensi model yang dibuat di atas
+ `InitialInstanceCount`: Jumlah instance yang akan diterapkan (mulai dengan 1, skala nanti jika diperlukan)
+ `InstanceType`: Jenis contoh ML dipilih pada Langkah 3

**Verifikasi pembuatan sumber daya**

Anda dapat memverifikasi bahwa sumber daya Anda berhasil dibuat:

```
# Describe the model
model_info = sagemaker.describe_model(ModelName=MODEL_NAME)
print(f"Model Status: {model_info['ModelName']} created")

# Describe the endpoint configuration
config_info = sagemaker.describe_endpoint_config(EndpointConfigName=ENDPOINT_CONFIG_NAME)
print(f"Endpoint Config Status: {config_info['EndpointConfigName']} created")
```

## Langkah 5: Menyebarkan titik akhir
<a name="nova-sagemaker-inference-step5"></a>

Langkah selanjutnya adalah menerapkan model Amazon Nova Anda dengan membuat titik akhir waktu SageMaker nyata. Titik akhir ini akan meng-host model Anda dan menyediakan titik akhir HTTPS yang aman untuk membuat permintaan inferensi.

Pembuatan titik akhir biasanya memakan waktu 15-30 menit untuk menyediakan AWS infrastruktur, mengunduh artefak model Anda, dan menginisialisasi wadah inferensi.

**Buat titik akhir**

```
import time

try:
    endpoint_response = sagemaker.create_endpoint(
        EndpointName=ENDPOINT_NAME,
        EndpointConfigName=ENDPOINT_CONFIG_NAME
    )
    print("Endpoint creation initiated successfully!")
    print(f"Endpoint ARN: {endpoint_response['EndpointArn']}")
except Exception as e:
    print(f"Error creating endpoint: {e}")
```

**Pantau pembuatan titik akhir**

Kode berikut akan melakukan polling status endpoint hingga penerapan selesai:

```
# Monitor endpoint creation progress
print("Waiting for endpoint creation to complete...")
print("This typically takes 15-30 minutes...\n")

while True:
    try:
        response = sagemaker.describe_endpoint(EndpointName=ENDPOINT_NAME)
        status = response['EndpointStatus']
        
        if status == 'Creating':
            print(f"⏳ Status: {status} - Provisioning infrastructure and loading model...")
        elif status == 'InService':
            print(f"✅ Status: {status}")
            print("\nEndpoint creation completed successfully!")
            print(f"Endpoint Name: {ENDPOINT_NAME}")
            print(f"Endpoint ARN: {response['EndpointArn']}")
            break
        elif status == 'Failed':
            print(f"❌ Status: {status}")
            print(f"Failure Reason: {response.get('FailureReason', 'Unknown')}")
            print("\nFull response:")
            print(response)
            break
        else:
            print(f"Status: {status}")
        
    except Exception as e:
        print(f"Error checking endpoint status: {e}")
        break
    
    time.sleep(30)  # Check every 30 seconds
```

**Verifikasi titik akhir sudah siap**

Setelah titik akhir InService, Anda dapat memverifikasi konfigurasinya:

```
# Get detailed endpoint information
endpoint_info = sagemaker.describe_endpoint(EndpointName=ENDPOINT_NAME)

print("\n=== Endpoint Details ===")
print(f"Endpoint Name: {endpoint_info['EndpointName']}")
print(f"Endpoint ARN: {endpoint_info['EndpointArn']}")
print(f"Status: {endpoint_info['EndpointStatus']}")
print(f"Creation Time: {endpoint_info['CreationTime']}")
print(f"Last Modified: {endpoint_info['LastModifiedTime']}")

# Get endpoint config for instance type details
endpoint_config_name = endpoint_info['EndpointConfigName']
endpoint_config = sagemaker.describe_endpoint_config(EndpointConfigName=endpoint_config_name)

# Display production variant details
for variant in endpoint_info['ProductionVariants']:
    print(f"\nProduction Variant: {variant['VariantName']}")
    print(f"  Current Instance Count: {variant['CurrentInstanceCount']}")
    print(f"  Desired Instance Count: {variant['DesiredInstanceCount']}")
    # Get instance type from endpoint config
    for config_variant in endpoint_config['ProductionVariants']:
        if config_variant['VariantName'] == variant['VariantName']:
            print(f"  Instance Type: {config_variant['InstanceType']}")
            break
```

**Memecahkan masalah kegagalan pembuatan titik akhir**

Alasan kegagalan umum:
+ **Kapasitas tidak mencukupi**: Jenis instans yang diminta tidak tersedia di wilayah Anda
  + Solusi: Coba jenis instans yang berbeda atau minta peningkatan kuota
+ **Izin IAM: Peran eksekusi tidak memiliki izin** yang diperlukan
  + Solusi: Verifikasi peran memiliki akses ke artefak model Amazon S3 dan izin yang diperlukan SageMaker 
+ **Artefak model tidak ditemukan**: URI Amazon S3 salah atau tidak dapat diakses
  + Solusi: Verifikasi URI Amazon S3 dan periksa izin bucket, pastikan Anda berada di wilayah yang benar
+ **Batas sumber daya**: Batas akun terlampaui untuk titik akhir atau instance
  + Solusi: Minta peningkatan kuota layanan melalui Service AWS Quotas atau Support

**catatan**  
Jika Anda perlu menghapus titik akhir yang gagal dan memulai dari awal:  

```
sagemaker.delete_endpoint(EndpointName=ENDPOINT_NAME)
```

## Langkah 6: Panggil titik akhir
<a name="nova-sagemaker-inference-step6"></a>

Setelah titik akhir Anda InService, Anda dapat mengirim permintaan inferensi untuk menghasilkan prediksi dari model Amazon Nova Anda. SageMaker mendukung titik akhir sinkron (real-time dengan mode streaming/non-streaming) dan titik akhir asinkron (berbasis Amazon S3 untuk pemrosesan batch).

**Siapkan klien runtime**

Buat klien SageMaker Runtime dengan pengaturan batas waktu yang sesuai:

```
import json
import boto3
import botocore
from botocore.exceptions import ClientError

# Configure client with appropriate timeouts
config = botocore.config.Config(
    read_timeout=120,      # Maximum time to wait for response
    connect_timeout=10,    # Maximum time to establish connection
    retries={'max_attempts': 3}  # Number of retry attempts
)

# Create SageMaker Runtime client
runtime_client = boto3.client('sagemaker-runtime', config=config, region_name=REGION)
```

**Buat fungsi inferensi universal**

Fungsi berikut menangani permintaan streaming dan non-streaming:

```
def invoke_nova_endpoint(request_body):
    """
    Invoke Nova endpoint with automatic streaming detection.
    
    Args:
        request_body (dict): Request payload containing prompt and parameters
    
    Returns:
        dict: Response from the model (for non-streaming requests)
        None: For streaming requests (prints output directly)
    """
    body = json.dumps(request_body)
    is_streaming = request_body.get("stream", False)
    
    try:
        print(f"Invoking endpoint ({'streaming' if is_streaming else 'non-streaming'})...")
        
        if is_streaming:
            response = runtime_client.invoke_endpoint_with_response_stream(
                EndpointName=ENDPOINT_NAME,
                ContentType='application/json',
                Body=body
            )
            
            event_stream = response['Body']
            for event in event_stream:
                if 'PayloadPart' in event:
                    chunk = event['PayloadPart']
                    if 'Bytes' in chunk:
                        data = chunk['Bytes'].decode()
                        print("Chunk:", data)
        else:
            # Non-streaming inference
            response = runtime_client.invoke_endpoint(
                EndpointName=ENDPOINT_NAME,
                ContentType='application/json',
                Accept='application/json',
                Body=body
            )
            
            response_body = response['Body'].read().decode('utf-8')
            result = json.loads(response_body)
            print("✅ Response received successfully")
            return result
    
    except ClientError as e:
        error_code = e.response['Error']['Code']
        error_message = e.response['Error']['Message']
        print(f"❌ AWS Error: {error_code} - {error_message}")
    except Exception as e:
        print(f"❌ Unexpected error: {str(e)}")
```

**Contoh 1: Penyelesaian obrolan non-streaming**

Gunakan format obrolan untuk interaksi percakapan:

```
# Non-streaming chat request
chat_request = {
    "messages": [
        {"role": "user", "content": "Hello! How are you?"}
    ],
    "max_tokens": 100,
    "max_completion_tokens": 100,  # Alternative to max_tokens
    "stream": False,
    "temperature": 0.7,
    "top_p": 0.9,
    "top_k": 50,
    "logprobs": True,
    "top_logprobs": 3,
    "reasoning_effort": "low",  # Options: "low", "high"
    "allowed_token_ids": None,  # List of allowed token IDs
    "truncate_prompt_tokens": None,  # Truncate prompt to this many tokens
    "stream_options": None
}

response = invoke_nova_endpoint(chat_request)
```

**Sampel respon:**

```
{
    "id": "chatcmpl-123456",
    "object": "chat.completion",
    "created": 1234567890,
    "model": "default",
    "choices": [
        {
            "index": 0,
            "message": {
                "role": "assistant",
                "content": "Hello! I'm doing well, thank you for asking. I'm here and ready to help you with any questions or tasks you might have. How can I assist you today?"
            },
            "logprobs": {
                "content": [
                    {
                        "token": "Hello",
                        "logprob": -0.123,
                        "top_logprobs": [
                            {"token": "Hello", "logprob": -0.123},
                            {"token": "Hi", "logprob": -2.456},
                            {"token": "Hey", "logprob": -3.789}
                        ]
                    }
                    # Additional tokens...
                ]
            },
            "finish_reason": "stop"
        }
    ],
    "usage": {
        "prompt_tokens": 12,
        "completion_tokens": 28,
        "total_tokens": 40
    }
}
```

**Contoh 2: Penyelesaian teks sederhana**

Gunakan format penyelesaian untuk pembuatan teks sederhana:

```
# Simple completion request
completion_request = {
    "prompt": "The capital of France is",
    "max_tokens": 50,
    "stream": False,
    "temperature": 0.0,
    "top_p": 1.0,
    "top_k": -1,  # -1 means no limit
    "logprobs": 3,  # Number of log probabilities to return
    "allowed_token_ids": None,  # List of allowed token IDs
    "truncate_prompt_tokens": None,  # Truncate prompt to this many tokens
    "stream_options": None
}

response = invoke_nova_endpoint(completion_request)
```

**Sampel respon:**

```
{
    "id": "cmpl-789012",
    "object": "text_completion",
    "created": 1234567890,
    "model": "default",
    "choices": [
        {
            "text": " Paris.",
            "index": 0,
            "logprobs": {
                "tokens": [" Paris", "."],
                "token_logprobs": [-0.001, -0.002],
                "top_logprobs": [
                    {" Paris": -0.001, " London": -5.234, " Rome": -6.789},
                    {".": -0.002, ",": -4.567, "!": -7.890}
                ]
            },
            "finish_reason": "stop"
        }
    ],
    "usage": {
        "prompt_tokens": 6,
        "completion_tokens": 2,
        "total_tokens": 8
    }
}
```

**Contoh 3: Penyelesaian obrolan streaming**

```
# Streaming chat request
streaming_request = {
    "messages": [
        {"role": "user", "content": "Tell me a short story about a robot"}
    ],
    "max_tokens": 200,
    "stream": True,
    "temperature": 0.7,
    "top_p": 0.95,
    "top_k": 40,
    "logprobs": True,
    "top_logprobs": 2,
    "reasoning_effort": "high",  # For more detailed reasoning
    "stream_options": {"include_usage": True}
}

invoke_nova_endpoint(streaming_request)
```

**Output streaming sampel:**

```
Chunk: data: {"id":"chatcmpl-029ca032-fa01-4868-80b7-c4cb1af90fb9","object":"chat.completion.chunk","created":1772060532,"model":"default","choices":[{"index":0,"delta":{"role":"assistant","content":"","reasoning_content":null},"logprobs":null,"finish_reason":null}],"prompt_token_ids":null}
Chunk: data: {"id":"chatcmpl-029ca032-fa01-4868-80b7-c4cb1af90fb9","object":"chat.completion.chunk","created":1772060532,"model":"default","choices":[{"index":0,"delta":{"content":" Once","reasoning_content":null},"logprobs":{"content":[{"token":"\u2581Once","logprob":-0.6078429222106934,"bytes":[226,150,129,79,110,99,101],"top_logprobs":[{"token":"\u2581Once","logprob":-0.6078429222106934,"bytes":[226,150,129,79,110,99,101]},{"token":"\u2581In","logprob":-0.7864127159118652,"bytes":[226,150,129,73,110]}]}]},"finish_reason":null,"token_ids":null}]}
Chunk: data: {"id":"chatcmpl-029ca032-fa01-4868-80b7-c4cb1af90fb9","object":"chat.completion.chunk","created":1772060532,"model":"default","choices":[{"index":0,"delta":{"content":" upon","reasoning_content":null},"logprobs":{"content":[{"token":"\u2581upon","logprob":-0.0012345,"bytes":[226,150,129,117,112,111,110],"top_logprobs":[{"token":"\u2581upon","logprob":-0.0012345,"bytes":[226,150,129,117,112,111,110]},{"token":"\u2581a","logprob":-6.789,"bytes":[226,150,129,97]}]}]},"finish_reason":null,"token_ids":null}]}
Chunk: data: {"id":"chatcmpl-029ca032-fa01-4868-80b7-c4cb1af90fb9","object":"chat.completion.chunk","created":1772060532,"model":"default","choices":[{"index":0,"delta":{"content":" a","reasoning_content":null},"logprobs":{"content":[{"token":"\u2581a","logprob":-0.0001234,"bytes":[226,150,129,97],"top_logprobs":[{"token":"\u2581a","logprob":-0.0001234,"bytes":[226,150,129,97]},{"token":"\u2581time","logprob":-9.123,"bytes":[226,150,129,116,105,109,101]}]}]},"finish_reason":null,"token_ids":null}]}
Chunk: data: {"id":"chatcmpl-029ca032-fa01-4868-80b7-c4cb1af90fb9","object":"chat.completion.chunk","created":1772060532,"model":"default","choices":[{"index":0,"delta":{"content":" time","reasoning_content":null},"logprobs":{"content":[{"token":"\u2581time","logprob":-0.0023456,"bytes":[226,150,129,116,105,109,101],"top_logprobs":[{"token":"\u2581time","logprob":-0.0023456,"bytes":[226,150,129,116,105,109,101]},{"token":",","logprob":-6.012,"bytes":[44]}]}]},"finish_reason":null,"token_ids":null}]}

# Additional chunks...

Chunk: data: {"id":"chatcmpl-029ca032-fa01-4868-80b7-c4cb1af90fb9","object":"chat.completion.chunk","created":1772060532,"model":"default","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":{"prompt_tokens":15,"completion_tokens":87,"total_tokens":102}}
Chunk: data: [DONE]
```

**Contoh 4: Penyelesaian obrolan multimodal**

Gunakan format multimodal untuk input gambar dan teks:

```
# Multimodal chat request (if supported by your model)
multimodal_request = {
    "messages": [
        {
            "role": "user",
            "content": [
                {"type": "text", "text": "What's in this image?"},
                {"type": "image_url", "image_url": {"url": "data:image/jpeg;base64,..."}}
            ]
        }
    ],
    "max_tokens": 150,
    "temperature": 0.3,
    "top_p": 0.8,
    "stream": False
}

response = invoke_nova_endpoint(multimodal_request)
```

**Sampel respon:**

```
{
    "id": "chatcmpl-345678",
    "object": "chat.completion",
    "created": 1234567890,
    "model": "default",
    "choices": [
        {
            "index": 0,
            "message": {
                "role": "assistant",
                "content": "The image shows..."
            },
            "finish_reason": "stop"
        }
    ],
    "usage": {
        "prompt_tokens": 1250,
        "completion_tokens": 45,
        "total_tokens": 1295
    }
}
```

## Langkah 7: Bersihkan sumber daya (Opsional)
<a name="nova-sagemaker-inference-step7"></a>

Untuk menghindari biaya yang tidak perlu, hapus AWS sumber daya yang Anda buat selama tutorial ini. SageMaker endpoint dikenakan biaya saat sedang berjalan, bahkan jika Anda tidak secara aktif membuat permintaan inferensi.

**penting**  
Menghapus sumber daya bersifat permanen dan tidak dapat dibatalkan. Pastikan Anda tidak lagi membutuhkan sumber daya ini sebelum melanjutkan.

**Hapus titik akhir**

```
import boto3

# Initialize SageMaker client
sagemaker = boto3.client('sagemaker', region_name=REGION)

try:
    print("Deleting endpoint...")
    sagemaker.delete_endpoint(EndpointName=ENDPOINT_NAME)
    print(f"✅ Endpoint '{ENDPOINT_NAME}' deletion initiated")
    print("Charges will stop once deletion completes (typically 2-5 minutes)")
except Exception as e:
    print(f"❌ Error deleting endpoint: {e}")
```

**catatan**  
Penghapusan titik akhir adalah asinkron. Anda dapat memantau status penghapusan:  

```
import time

print("Monitoring endpoint deletion...")
while True:
    try:
        response = sagemaker.describe_endpoint(EndpointName=ENDPOINT_NAME)
        status = response['EndpointStatus']
        print(f"Status: {status}")
        time.sleep(10)
    except sagemaker.exceptions.ClientError as e:
        if e.response['Error']['Code'] == 'ValidationException':
            print("✅ Endpoint successfully deleted")
            break
        else:
            print(f"Error: {e}")
            break
```

**Hapus konfigurasi titik akhir**

Setelah titik akhir dihapus, hapus konfigurasi titik akhir:

```
try:
    print("Deleting endpoint configuration...")
    sagemaker.delete_endpoint_config(EndpointConfigName=ENDPOINT_CONFIG_NAME)
    print(f"✅ Endpoint configuration '{ENDPOINT_CONFIG_NAME}' deleted")
except Exception as e:
    print(f"❌ Error deleting endpoint configuration: {e}")
```

**Hapus model**

Hapus objek SageMaker model:

```
try:
    print("Deleting model...")
    sagemaker.delete_model(ModelName=MODEL_NAME)
    print(f"✅ Model '{MODEL_NAME}' deleted")
except Exception as e:
    print(f"❌ Error deleting model: {e}")
```

# Referensi API
<a name="nova-sagemaker-inference-api-reference"></a>

Model Amazon Nova SageMaker menggunakan SageMaker Runtime API standar untuk inferensi. Untuk dokumentasi API yang lengkap, lihat [Menguji model yang diterapkan](https://docs.aws.amazon.com//sagemaker/latest/dg/realtime-endpoints-test-endpoints.html).

## Pemanggilan titik akhir
<a name="nova-sagemaker-inference-api-invocation"></a>

Model Amazon Nova SageMaker mendukung dua metode pemanggilan:
+ **Pemanggilan sinkron**: Gunakan [InvokeEndpoint](https://docs.aws.amazon.com//sagemaker/latest/APIReference/API_runtime_InvokeEndpoint.html)API untuk permintaan inferensi non-streaming real-time.
+ **Pemanggilan streaming**: Gunakan [InvokeEndpointWithResponseStream](https://docs.aws.amazon.com//sagemaker/latest/APIReference/API_runtime_InvokeEndpointWithResponseStream.html)API untuk permintaan inferensi streaming waktu nyata.

## Format permintaan
<a name="nova-sagemaker-inference-api-request"></a>

Model Amazon Nova mendukung dua format permintaan:

**Format penyelesaian obrolan**

Gunakan format ini untuk interaksi percakapan:

```
{
  "messages": [
    {"role": "user", "content": "string"}
  ],
  "max_tokens": integer,
  "max_completion_tokens": integer,
  "stream": boolean,
  "temperature": float,
  "top_p": float,
  "top_k": integer,
  "logprobs": boolean,
  "top_logprobs": integer,
  "reasoning_effort": "low" | "high",
  "allowed_token_ids": [integer],
  "truncate_prompt_tokens": integer,
  "stream_options": {
    "include_usage": boolean
  }
}
```

**Format penyelesaian teks**

Gunakan format ini untuk pembuatan teks sederhana:

```
{
  "prompt": "string",
  "max_tokens": integer,
  "stream": boolean,
  "temperature": float,
  "top_p": float,
  "top_k": integer,
  "logprobs": integer,
  "allowed_token_ids": [integer],
  "truncate_prompt_tokens": integer,
  "stream_options": {
    "include_usage": boolean
  }
}
```

**Format penyelesaian obrolan multimodal**

Gunakan format ini untuk input gambar dan teks:

```
{
  "messages": [
    {
      "role": "user",
      "content": [
        {"type": "text", "text": "What's in this image?"},
        {"type": "image_url", "image_url": {"url": "data:image/jpeg;base64,..."}}
      ]
    }
  ],
  "max_tokens": integer,
  "temperature": float,
  "top_p": float,
  "stream": boolean
}
```

**Parameter permintaan**
+ `messages`(array): Untuk format penyelesaian obrolan. Array objek pesan dengan `role` dan `content` bidang. Konten dapat berupa string untuk text-only atau array untuk input multimodal.
+ `prompt`(string): Untuk format penyelesaian teks. Teks masukan untuk menghasilkan dari.
+ `max_tokens`(integer): Jumlah maksimum token yang akan dihasilkan dalam respons. Rentang: 1 atau lebih besar.
+ `max_completion_tokens`(integer): Alternatif untuk max\$1tokens untuk penyelesaian obrolan. Jumlah maksimum token penyelesaian yang akan dihasilkan.
+ `temperature`(float): Mengontrol keacakan dalam generasi. Rentang: 0,0 hingga 2,0 (0,0 = deterministik, 2,0 = keacakan maksimum).
+ `top_p`(mengambang): Ambang pengambilan sampel nukleus. Rentang: 1e-10 hingga 1.0.
+ `top_k`(integer): Membatasi pemilihan token ke token K teratas yang paling mungkin. Rentang: -1 atau lebih besar (-1 = tidak ada batas).
+ `stream`(boolean): Apakah akan mengalirkan respons. Setel ke `true` untuk streaming, `false` untuk non-streaming.
+ `logprobs`(boolean/integer): Untuk penyelesaian obrolan, gunakan boolean. Untuk penyelesaian teks, gunakan bilangan bulat untuk jumlah probabilitas log untuk kembali. Rentang: 1 hingga 20.
+ `top_logprobs`(integer): Jumlah token yang paling mungkin untuk mengembalikan probabilitas log untuk (hanya penyelesaian obrolan).
+ `reasoning_effort`(string): Tingkat upaya penalaran. Opsi: “rendah”, “tinggi” (penyelesaian obrolan hanya untuk model khusus Nova 2 Lite).
+ `allowed_token_ids`(array): Daftar token IDs yang diizinkan untuk dihasilkan. Membatasi output ke token tertentu.
+ `truncate_prompt_tokens`(integer): Pangkas prompt ke banyak token ini jika melebihi batas.
+ `stream_options`(objek): Opsi untuk respons streaming. Berisi `include_usage` boolean untuk menyertakan penggunaan token dalam respons streaming.

## Format respons
<a name="nova-sagemaker-inference-api-response"></a>

Format respons tergantung pada metode pemanggilan dan jenis permintaan:

**Respons penyelesaian obrolan (non-streaming)**

Untuk permintaan penyelesaian obrolan sinkron:

```
{
  "id": "chatcmpl-123e4567-e89b-12d3-a456-426614174000",
  "object": "chat.completion",
  "created": 1677652288,
  "model": "nova-micro-custom",
  "choices": [
    {
      "index": 0,
      "message": {
        "role": "assistant",
        "content": "Hello! I'm doing well, thank you for asking. How can I help you today?",
        "refusal": null,
        "reasoning": null,
        "reasoning_content": null
      },
      "logprobs": {
        "content": [
          {
            "token": "Hello",
            "logprob": -0.31725305,
            "bytes": [72, 101, 108, 108, 111],
            "top_logprobs": [
              {
                "token": "Hello",
                "logprob": -0.31725305,
                "bytes": [72, 101, 108, 108, 111]
              },
              {
                "token": "Hi",
                "logprob": -1.3190403,
                "bytes": [72, 105]
              }
            ]
          }
        ]
      },
      "finish_reason": "stop",
      "stop_reason": null,
      "token_ids": [9906, 0, 358, 2157, 1049, 11, 1309, 345, 369, 6464, 13]
    }
  ],
  "usage": {
    "prompt_tokens": 9,
    "completion_tokens": 12,
    "total_tokens": 21,
    "prompt_tokens_details": {
      "cached_tokens": 0
    }
  },
  "prompt_token_ids": [9906, 0, 358]
}
```

**Respons penyelesaian teks (non-streaming)**

Untuk permintaan penyelesaian teks sinkron:

```
{
  "id": "cmpl-123e4567-e89b-12d3-a456-426614174000",
  "object": "text_completion",
  "created": 1677652288,
  "model": "nova-micro-custom",
  "choices": [
    {
      "index": 0,
      "text": "Paris, the capital and most populous city of France.",
      "logprobs": {
        "tokens": ["Paris", ",", " the", " capital"],
        "token_logprobs": [-0.31725305, -0.07918124, -0.12345678, -0.23456789],
        "top_logprobs": [
          {
            "Paris": -0.31725305,
            "London": -1.3190403,
            "Rome": -2.1234567
          },
          {
            ",": -0.07918124,
            " is": -1.2345678
          }
        ]
      },
      "finish_reason": "stop",
      "stop_reason": null,
      "prompt_token_ids": [464, 6864, 315, 4881, 374],
      "token_ids": [3915, 11, 279, 6864, 323, 1455, 95551, 3363, 315, 4881, 13]
    }
  ],
  "usage": {
    "prompt_tokens": 5,
    "completion_tokens": 11,
    "total_tokens": 16,
    "prompt_tokens_details": {
      "cached_tokens": 0
    }
  }
}
```

**Respons streaming penyelesaian obrolan**

Untuk permintaan penyelesaian obrolan streaming, tanggapan dikirim sebagai Server-Sent Events (SSE):

```
data: {
  "id": "chatcmpl-123e4567-e89b-12d3-a456-426614174000",
  "object": "chat.completion.chunk",
  "created": 1677652288,
  "model": "nova-micro-custom",
  "choices": [
    {
      "index": 0,
      "delta": {
        "role": "assistant",
        "content": "Hello",
        "refusal": null,
        "reasoning": null,
        "reasoning_content": null
      },
      "logprobs": {
        "content": [
          {
            "token": "Hello",
            "logprob": -0.31725305,
            "bytes": [72, 101, 108, 108, 111],
            "top_logprobs": [
              {
                "token": "Hello",
                "logprob": -0.31725305,
                "bytes": [72, 101, 108, 108, 111]
              }
            ]
          }
        ]
      },
      "finish_reason": null,
      "stop_reason": null
    }
  ],
  "usage": null,
  "prompt_token_ids": null
}

data: {
  "id": "chatcmpl-123e4567-e89b-12d3-a456-426614174000",
  "object": "chat.completion.chunk",
  "created": 1677652288,
  "model": "nova-micro-custom",
  "choices": [
    {
      "index": 0,
      "delta": {
        "content": "! I'm"
      },
      "logprobs": null,
      "finish_reason": null,
      "stop_reason": null
    }
  ],
  "usage": null
}

data: {
  "id": "chatcmpl-123e4567-e89b-12d3-a456-426614174000",
  "object": "chat.completion.chunk",
  "created": 1677652288,
  "model": "nova-micro-custom",
  "choices": [
    {
      "index": 0,
      "delta": {},
      "finish_reason": "stop",
      "stop_reason": null
    }
  ],
  "usage": {
    "prompt_tokens": 9,
    "completion_tokens": 12,
    "total_tokens": 21,
    "prompt_tokens_details": {
      "cached_tokens": 0
    }
  }
}

data: [DONE]
```

**Respons streaming penyelesaian teks**

Untuk permintaan penyelesaian teks streaming:

```
data: {
  "id": "cmpl-123e4567-e89b-12d3-a456-426614174000",
  "object": "text_completion",
  "created": 1677652288,
  "model": "nova-micro-custom",
  "choices": [
    {
      "index": 0,
      "text": "Paris",
      "logprobs": {
        "tokens": ["Paris"],
        "token_logprobs": [-0.31725305],
        "top_logprobs": [
          {
            "Paris": -0.31725305,
            "London": -1.3190403
          }
        ]
      },
      "finish_reason": null,
      "stop_reason": null
    }
  ],
  "usage": null
}

data: {
  "id": "cmpl-123e4567-e89b-12d3-a456-426614174000",
  "object": "text_completion",
  "created": 1677652288,
  "model": "nova-micro-custom",
  "choices": [
    {
      "index": 0,
      "text": ", the capital",
      "logprobs": null,
      "finish_reason": null,
      "stop_reason": null
    }
  ],
  "usage": null
}

data: {
  "id": "cmpl-123e4567-e89b-12d3-a456-426614174000",
  "object": "text_completion",
  "created": 1677652288,
  "model": "nova-micro-custom",
  "choices": [
    {
      "index": 0,
      "text": "",
      "finish_reason": "stop",
      "stop_reason": null
    }
  ],
  "usage": {
    "prompt_tokens": 5,
    "completion_tokens": 11,
    "total_tokens": 16
  }
}

data: [DONE]
```

**Penjelasan bidang respons**
+ `id`: Pengidentifikasi unik untuk penyelesaian
+ `object`: Jenis objek yang dikembalikan (“chat.completion”, “text\$1completion”, “chat.completion.chunk”)
+ `created`: Stempel waktu Unix saat penyelesaian dibuat
+ `model`: Model yang digunakan untuk penyelesaian
+ `choices`: Array pilihan penyelesaian
+ `usage`: Informasi penggunaan token termasuk prompt, penyelesaian, dan total token
+ `logprobs`: Log informasi probabilitas untuk token (bila diminta)
+ `finish_reason`: Alasan mengapa model berhenti menghasilkan (“stop”, “length”, “content\$1filter”)
+ `delta`: Konten tambahan dalam respons streaming
+ `reasoning`: Konten penalaran saat reasing\$1effort digunakan
+ `token_ids`: Array token IDs untuk teks yang dihasilkan

Untuk dokumentasi API selengkapnya, lihat [Referensi InvokeEndpoint InvokeEndpointWithResponseStream API](https://docs.aws.amazon.com//sagemaker/latest/APIReference/API_runtime_InvokeEndpoint.html) [dan referensi API](https://docs.aws.amazon.com//sagemaker/latest/APIReference/API_runtime_InvokeEndpointWithResponseStream.html).

# Evaluasi Model yang Dihosting pada SageMaker Inferensi
<a name="nova-eval-on-sagemaker-inference"></a>

Panduan ini menjelaskan cara mengevaluasi model Amazon Nova khusus Anda yang diterapkan pada titik akhir SageMaker inferensi menggunakan [Inspect AI](https://github.com/UKGovernmentBEIS/inspect_ai), kerangka evaluasi sumber terbuka.

**catatan**  
Untuk panduan langsung, lihat notebook quickstart [SageMaker Inspect](https://github.com/aws-samples/amazon-nova-samples/tree/main/customization/sagemaker-inference/sagemaker_inspect_quickstart.ipynb) AI.

## Ikhtisar
<a name="nova-eval-sagemaker-overview"></a>

Anda dapat mengevaluasi model Amazon Nova khusus yang digunakan pada SageMaker titik akhir menggunakan tolok ukur standar dari komunitas riset AI. Pendekatan ini memungkinkan Anda untuk:
+ Evaluasi model Amazon Nova yang disesuaikan (disetel dengan baik, disuling, atau disesuaikan) dalam skala besar
+ Jalankan evaluasi dengan inferensi paralel di beberapa instance titik akhir
+ Bandingkan kinerja model menggunakan tolok ukur seperti MMLU, TruthfulQA, dan HumanEval
+ Integrasikan dengan SageMaker infrastruktur yang ada

## Model yang didukung
<a name="nova-eval-sagemaker-supported-models"></a>

Penyedia SageMaker inferensi bekerja dengan:
+ Model Amazon Nova (Nova Micro, Nova Lite, Nova Lite 2)
+ Model yang digunakan melalui server inferensi yang kompatibel dengan VLLM atau OpenAI
+ Titik akhir apa pun yang mendukung format API Penyelesaian OpenAI Chat

## Prasyarat
<a name="nova-eval-sagemaker-prerequisites"></a>

Sebelum Anda mulai, pastikan Anda memiliki:
+ Sebuah Akun AWS dengan izin untuk membuat dan memanggil titik akhir SageMaker 
+ AWS kredensil yang dikonfigurasi melalui AWS CLI, variabel lingkungan, atau peran IAM
+ Python 3.9 atau lebih tinggi

**Izin IAM yang diperlukan**

Pengguna atau peran IAM Anda memerlukan izin berikut:

```
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "sagemaker:InvokeEndpoint",
        "sagemaker:DescribeEndpoint"
      ],
      "Resource": "arn:aws:sagemaker:*:*:endpoint/*"
    }
  ]
}
```

## Langkah 1: Menyebarkan titik akhir SageMaker
<a name="nova-eval-sagemaker-step1"></a>

Sebelum menjalankan evaluasi, Anda memerlukan titik akhir SageMaker inferensi yang menjalankan model Anda.

Untuk petunjuk tentang membuat titik akhir SageMaker inferensi dengan model Amazon Nova, lihat. [Memulai](nova-sagemaker-inference-getting-started.md)

Setelah titik akhir Anda dalam `InService` status, perhatikan nama titik akhir untuk digunakan dalam perintah evaluasi.

## Langkah 2: Instal dependensi evaluasi
<a name="nova-eval-sagemaker-step2"></a>

Buat lingkungan virtual Python dan instal paket yang diperlukan.

```
# Create virtual environment
python3.12 -m venv venv
source venv/bin/activate

# Install uv for faster package installation
pip install uv

# Install Inspect AI and evaluation benchmarks
uv pip install inspect-ai inspect-evals

# Install AWS dependencies
uv pip install aioboto3 boto3 botocore openai
```

## Langkah 3: Konfigurasikan AWS kredensional
<a name="nova-eval-sagemaker-step3"></a>

Pilih salah satu metode otentikasi berikut:

**Opsi 1: AWS CLI (Direkomendasikan)**

```
aws configure
```

Masukkan ID Kunci AWS Akses, Kunci Akses Rahasia, dan wilayah default saat diminta.

**Opsi 2: Variabel lingkungan**

```
export AWS_ACCESS_KEY_ID=your_access_key
export AWS_SECRET_ACCESS_KEY=your_secret_key
export AWS_DEFAULT_REGION=us-west-2
```

**Opsi 3: Peran IAM**

Jika berjalan di Amazon EC2 atau SageMaker notebook, peran IAM instans akan digunakan secara otomatis.

**Verifikasi kredensialnya**

```
import boto3

sts = boto3.client('sts')
identity = sts.get_caller_identity()
print(f"Account: {identity['Account']}")
print(f"User/Role: {identity['Arn']}")
```

## Langkah 4: Instal SageMaker penyedia
<a name="nova-eval-sagemaker-step4"></a>

 SageMaker Penyedia memungkinkan Inspect AI untuk berkomunikasi dengan titik SageMaker akhir Anda. Proses instalasi penyedia disederhanakan di notebook [quickstart](https://github.com/aws-samples/amazon-nova-samples/tree/main/customization/sagemaker-inference/sagemaker_inspect_quickstart.ipynb).

## Langkah 5: Unduh tolok ukur evaluasi
<a name="nova-eval-sagemaker-step5"></a>

Kloning repositori Inspect Evals untuk mengakses tolok ukur standar:

```
git clone https://github.com/UKGovernmentBEIS/inspect_evals.git
```

Repositori ini mencakup tolok ukur seperti:
+ MMLU dan MMLU-Pro (pengetahuan dan penalaran)
+ TruthfulQA (kebenaran)
+ HumanEval (pembuatan kode)
+ GSM8K (penalaran matematika)

## Langkah 6: Jalankan evaluasi
<a name="nova-eval-sagemaker-step6"></a>

Jalankan evaluasi menggunakan SageMaker endpoint Anda:

```
cd inspect_evals/src/inspect_evals/

inspect eval mmlu_pro/mmlu_pro.py \
  --model sagemaker/my-nova-endpoint \
  -M region_name=us-west-2 \
  --max-connections 256 \
  --max-retries 100 \
  --display plain
```

**Parameter kunci**


| Parameter | Default | Deskripsi | 
| --- | --- | --- | 
| --max-connections | 10 | Jumlah permintaan paralel ke titik akhir. Skala dengan jumlah instance (misalnya, 10 instance × 25 = 250). | 
| --max-retries | 3 | Coba lagi upaya untuk permintaan yang gagal. Gunakan 50-100 untuk evaluasi besar. | 
| -M region\$1name | us-east-1 | AWS wilayah tempat titik akhir Anda diterapkan. | 
| -M read\$1timeout | 600 | Minta batas waktu dalam hitungan detik. | 
| -M connect\$1timeout | 60 | Batas waktu koneksi dalam hitungan detik. | 

**Rekomendasi penyetelan**

Untuk titik akhir multi-instance:

```
# 10-instance endpoint example
--max-connections 250   # ~25 connections per instance
--max-retries 100       # Handle transient errors
```

Pengaturan `--max-connections` terlalu tinggi dapat membanjiri titik akhir dan menyebabkan pelambatan. Mengaturnya terlalu rendah kurang memanfaatkan kapasitas.

## Langkah 7: Lihat hasil
<a name="nova-eval-sagemaker-step7"></a>

Luncurkan penampil Inspect AI untuk menganalisis hasil evaluasi:

```
inspect view
```

Penampil menampilkan:
+ Skor dan metrik keseluruhan
+ Hasil per sampel dengan respons model
+ Analisis kesalahan dan pola kegagalan

## Mengelola titik akhir
<a name="nova-eval-sagemaker-managing-endpoints"></a>

**Perbarui titik akhir**

Untuk memperbarui titik akhir yang ada dengan model atau konfigurasi baru:

```
import boto3

sagemaker = boto3.client('sagemaker', region_name=REGION)

# Create new model and endpoint configuration
# Then update the endpoint
sagemaker.update_endpoint(
    EndpointName=EXISTING_ENDPOINT_NAME,
    EndpointConfigName=NEW_ENDPOINT_CONFIG_NAME
)
```

**Hapus titik akhir**

```
sagemaker.delete_endpoint(EndpointName=ENDPOINT_NAME)
```

## Tolok ukur khusus orientasi
<a name="nova-eval-sagemaker-custom-benchmarks"></a>

Anda dapat menambahkan tolok ukur baru ke Inspect AI menggunakan alur kerja berikut:

1. Pelajari format dataset benchmark dan metrik evaluasi

1. Tinjau implementasi serupa di `inspect_evals/`

1. Buat file tugas yang mengonversi catatan kumpulan data untuk Memeriksa sampel AI

1. Menerapkan pemecah dan pencetak gol yang tepat

1. Validasi dengan uji coba kecil

Contoh struktur tugas:

```
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("dataset_name", split="test"),
        solver=multiple_choice(),
        scorer=choice()
    )
```

## Pemecahan masalah
<a name="nova-eval-sagemaker-troubleshooting"></a>

**Masalah umum**

**Pelambatan titik akhir atau batas waktu**
+ Mengurangi `--max-connections`
+ Meningkat `--max-retries`
+ Periksa CloudWatch metrik titik akhir untuk masalah kapasitas

**Kesalahan otentikasi**
+ Verifikasi AWS kredensil dikonfigurasi dengan benar
+ Periksa izin IAM termasuk `sagemaker:InvokeEndpoint`

**Kesalahan model**
+ Verifikasi titik akhir dalam status `InService`
+ Periksa apakah model mendukung format OpenAI Chat Completions API

## Sumber daya terkait
<a name="nova-eval-sagemaker-related-resources"></a>
+ [Periksa Dokumentasi AI](https://inspect.ai-safety-institute.org.uk/)
+ [Periksa Repositori Evals](https://github.com/UKGovernmentBEIS/inspect_evals)
+ [SageMaker Panduan Pengembang](https://docs.aws.amazon.com//sagemaker/latest/dg/whatis.html)
+ [Menyebarkan Model untuk Inferensi](https://docs.aws.amazon.com//sagemaker/latest/dg/deploy-model.html)
+ [Mengkonfigurasi AWS CLI](https://docs.aws.amazon.com//cli/latest/userguide/cli-chap-configure.html)

# Penyebaran Model Amazon Nova Forge di deteksi penyalahgunaan SageMaker Inferensi Amazon
<a name="nova-sagemaker-inference-abuse-detection"></a>

AWS berkomitmen untuk penggunaan AI yang bertanggung jawab. [Untuk membantu mencegah potensi penyalahgunaan, saat Anda menerapkan Model Amazon Nova Forge di Inferensi Amazon, SageMaker SageMaker Inferensi menerapkan mekanisme deteksi penyalahgunaan otomatis untuk mengidentifikasi potensi pelanggaran [Kebijakan Penggunaan yang Dapat Diterima (AUP) dan Ketentuan Layanan, termasuk Kebijakan](https://aws.amazon.com/aup/) AI yang Bertanggung Jawab. AWS](https://aws.amazon.com/ai/responsible-ai/policy/)

Mekanisme deteksi penyalahgunaan kami sepenuhnya otomatis, sehingga tidak ada tinjauan manusia terhadap, atau akses ke, input pengguna atau output model.

Deteksi penyalahgunaan otomatis meliputi:
+ **Mengkategorikan konten** — Kami menggunakan pengklasifikasi untuk mendeteksi konten berbahaya (seperti konten yang memicu kekerasan) dalam input pengguna dan keluaran model. Pengklasifikasi adalah algoritma yang memproses input dan output model, dan menetapkan jenis bahaya dan tingkat kepercayaan. Kami dapat menjalankan pengklasifikasi ini pada penggunaan Amazon Nova Forge Model. Proses klasifikasi otomatis dan tidak melibatkan tinjauan manusia terhadap input pengguna atau output model.
+ **Identifikasi pola** — Kami menggunakan metrik pengklasifikasi untuk mengidentifikasi potensi pelanggaran dan perilaku berulang. Kami dapat mengkompilasi dan membagikan metrik pengklasifikasi anonim. SageMaker Inferensi Amazon tidak menyimpan input pengguna atau output model.
+ **Mendeteksi dan memblokir materi pelecehan seksual anak (CSAM)** - Anda bertanggung jawab atas konten yang Anda (dan pengguna akhir Anda) unggah ke SageMaker Inferensi Amazon dan harus memastikan konten ini bebas dari gambar ilegal. Untuk membantu menghentikan penyebaran CSAM, saat menerapkan Model Amazon Nova Forge di SageMaker Amazon SageMaker Inference, Inference dapat menggunakan mekanisme deteksi penyalahgunaan otomatis (seperti teknologi pencocokan hash atau pengklasifikasi) untuk mendeteksi CSAM yang jelas. Jika SageMaker Inferensi Amazon mendeteksi CSAM yang jelas dalam input gambar Anda, Inferensi SageMaker Amazon akan memblokir permintaan dan Anda akan menerima pesan kesalahan otomatis. Amazon SageMaker Inference juga dapat mengajukan laporan ke National Center for Missing and Exploited Children (NCMEC) atau otoritas terkait. Kami menganggap serius CSAM dan akan terus memperbarui mekanisme deteksi, pemblokiran, dan pelaporan kami. Anda mungkin diwajibkan oleh hukum yang berlaku untuk mengambil tindakan tambahan, dan Anda bertanggung jawab atas tindakan tersebut.

Setelah mekanisme deteksi penyalahgunaan otomatis kami mengidentifikasi potensi pelanggaran, kami dapat meminta informasi tentang penggunaan SageMaker Inferensi Amazon oleh Anda dan kepatuhan terhadap persyaratan layanan kami. Jika Anda tidak responsif, tidak mau, atau tidak dapat mematuhi persyaratan atau kebijakan ini, AWS dapat menangguhkan akses Anda ke Inferensi Amazon. SageMaker Anda juga dapat ditagih untuk pekerjaan inferensi yang gagal jika pengujian otomatis kami mendeteksi respons model yang tidak konsisten dengan persyaratan dan kebijakan kami.

Hubungi AWS Support jika Anda memiliki pertanyaan tambahan. Untuk informasi lebih lanjut, lihat [Amazon SageMaker FAQs](https://aws.amazon.com/sagemaker/ai/faqs/).