

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

# Validasi model dalam produksi
<a name="model-validation"></a>

 Dengan SageMaker AI, Anda dapat menguji beberapa model atau versi model di belakang titik akhir yang sama menggunakan varian. Varian terdiri dari instance ML dan komponen penyajian yang ditentukan dalam model SageMaker AI. Anda dapat memiliki beberapa varian di belakang titik akhir. Setiap varian dapat memiliki jenis instans yang berbeda atau model SageMaker AI yang dapat diskalakan otomatis secara independen dari yang lain. Model dalam varian dapat dilatih menggunakan kumpulan data yang berbeda, algoritme yang berbeda, kerangka kerja ML yang berbeda, atau kombinasi dari semua ini. Semua varian di balik titik akhir berbagi kode inferensi yang sama. SageMaker AI mendukung dua jenis varian, varian produksi dan varian bayangan. 

 Jika Anda memiliki beberapa varian produksi di belakang titik akhir, maka Anda dapat mengalokasikan sebagian permintaan inferensi Anda ke setiap varian. Setiap permintaan dialihkan ke hanya satu varian produksi. Varian produksi tempat permintaan diarahkan memberikan respons kepada penelepon. Anda dapat membandingkan bagaimana varian produksi bekerja relatif satu sama lain. 

 Anda juga dapat memiliki varian bayangan yang sesuai dengan varian produksi di belakang titik akhir. Sebagian dari permintaan inferensi yang masuk ke varian produksi direplikasi ke varian bayangan. Respons varian bayangan dicatat untuk perbandingan dan tidak dikembalikan ke pemanggil. Ini memungkinkan Anda menguji kinerja varian bayangan tanpa mengekspos pemanggil ke respons yang dihasilkan oleh varian bayangan. 

**Topics**
+ [Menguji model dengan varian produksi](model-ab-testing.md)
+ [Menguji model dengan varian bayangan](model-shadow-deployment.md)

# Menguji model dengan varian produksi
<a name="model-ab-testing"></a>

 Dalam alur kerja produksi, ilmuwan dan insinyur data sering mencoba meningkatkan kinerja menggunakan berbagai metode, seperti, pelatihan tentang data tambahan atau yang lebih baru[Penyetelan model otomatis dengan AI SageMaker](automatic-model-tuning.md), meningkatkan pemilihan fitur, menggunakan instance yang diperbarui dengan lebih baik, dan wadah penyajian. Anda dapat menggunakan varian produksi untuk membandingkan model, instans, dan kontainer Anda, dan memilih kandidat berkinerja terbaik untuk menanggapi permintaan inferensi. 

 Dengan titik akhir multi-varian SageMaker AI, Anda dapat mendistribusikan permintaan pemanggilan titik akhir di beberapa varian produksi dengan menyediakan distribusi lalu lintas untuk setiap varian, atau Anda dapat memanggil varian tertentu secara langsung untuk setiap permintaan. Dalam topik ini, kita melihat kedua metode untuk menguji model ML. 

**Topics**
+ [Uji model dengan menentukan distribusi lalu lintas](#model-testing-traffic-distribution)
+ [Uji model dengan menggunakan varian tertentu](#model-testing-target-variant)
+ [Contoh A/B uji model](#model-ab-test-example)

## Uji model dengan menentukan distribusi lalu lintas
<a name="model-testing-traffic-distribution"></a>

 Untuk menguji beberapa model dengan mendistribusikan lalu lintas di antara mereka, tentukan persentase lalu lintas yang diarahkan ke setiap model dengan menentukan bobot untuk setiap varian produksi dalam konfigurasi titik akhir. Untuk informasi, lihat [CreateEndpointConfig](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateEndpointConfig.html). Diagram berikut menunjukkan cara kerjanya secara lebih rinci. 

![\[Contoh yang menunjukkan bagaimana mendistribusikan lalu lintas antar model yang menggunakan InvokeEndpoint bekerja di SageMaker AI.\]](http://docs.aws.amazon.com/id_id/sagemaker/latest/dg/images/model-traffic-distribution.png)


## Uji model dengan menggunakan varian tertentu
<a name="model-testing-target-variant"></a>

 Untuk menguji beberapa model dengan menjalankan model tertentu untuk setiap permintaan, tentukan versi spesifik model yang ingin Anda panggil dengan memberikan nilai untuk `TargetVariant` parameter saat Anda memanggil. [InvokeEndpoint](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_runtime_InvokeEndpoint.html) SageMaker AI memastikan bahwa permintaan diproses oleh varian produksi yang Anda tentukan. Jika Anda telah menyediakan distribusi lalu lintas dan menentukan nilai untuk `TargetVariant` parameter, perutean yang ditargetkan akan mengesampingkan distribusi lalu lintas acak. Diagram berikut menunjukkan cara kerjanya secara lebih rinci. 

![\[Contoh yang menunjukkan cara menjalankan model tertentu untuk setiap permintaan yang digunakan InvokeEndpoint bekerja di SageMaker AI.\]](http://docs.aws.amazon.com/id_id/sagemaker/latest/dg/images/model-target-variant.png)


## Contoh A/B uji model
<a name="model-ab-test-example"></a>

 Melakukan A/B pengujian antara model baru dan model lama dengan lalu lintas produksi dapat menjadi langkah terakhir yang efektif dalam proses validasi untuk model baru. Dalam A/B pengujian, Anda menguji berbagai varian model Anda dan membandingkan kinerja masing-masing varian. Jika versi model yang lebih baru memberikan kinerja yang lebih baik daripada versi yang ada sebelumnya, ganti versi lama model dengan versi baru dalam produksi. 

 Contoh berikut menunjukkan bagaimana melakukan pengujian A/B model. Untuk contoh buku catatan yang mengimplementasikan contoh ini, lihat [“A/B Menguji model ML dalam produksi](https://sagemaker-examples.readthedocs.io/en/latest/sagemaker_endpoints/a_b_testing/a_b_testing.html). 

### Langkah 1: Buat dan terapkan model
<a name="model-ab-test-step1"></a>

 Pertama, kami menentukan di mana model kami berada di Amazon S3. Lokasi-lokasi ini digunakan saat kami menerapkan model kami dalam langkah-langkah selanjutnya: 

```
model_url = f"s3://{path_to_model_1}"
model_url2 = f"s3://{path_to_model_2}"
```

 Selanjutnya, kita membuat objek model dengan data gambar dan model. Objek model ini digunakan untuk menyebarkan varian produksi pada titik akhir. Model dikembangkan dengan melatih model ML pada kumpulan data yang berbeda, algoritme atau kerangka kerja ML yang berbeda, dan hiperparameter yang berbeda: 

```
from sagemaker.amazon.amazon_estimator import get_image_uri

model_name = f"DEMO-xgb-churn-pred-{datetime.now():%Y-%m-%d-%H-%M-%S}"
model_name2 = f"DEMO-xgb-churn-pred2-{datetime.now():%Y-%m-%d-%H-%M-%S}"
image_uri = get_image_uri(boto3.Session().region_name, 'xgboost', '0.90-1')
image_uri2 = get_image_uri(boto3.Session().region_name, 'xgboost', '0.90-2')

sm_session.create_model(
    name=model_name,
    role=role,
    container_defs={
        'Image': image_uri,
        'ModelDataUrl': model_url
    }
)

sm_session.create_model(
    name=model_name2,
    role=role,
    container_defs={
        'Image': image_uri2,
        'ModelDataUrl': model_url2
    }
)
```

 Kami sekarang membuat dua varian produksi, masing-masing dengan model dan persyaratan sumber daya yang berbeda (jenis dan jumlah instance). Ini memungkinkan Anda untuk juga menguji model pada jenis instans yang berbeda. 

 Kami menetapkan initial\$1weight 1 untuk kedua varian. Ini berarti bahwa 50% dari permintaan pergi ke`Variant1`, dan 50% sisanya dari permintaan ke`Variant2`. Jumlah bobot di kedua varian adalah 2 dan setiap varian memiliki penetapan bobot 1. Ini berarti bahwa setiap varian menerima 1/2, atau 50%, dari total lalu lintas. 

```
from sagemaker.session import production_variant

variant1 = production_variant(
               model_name=model_name,
               instance_type="ml.m5.xlarge",
               initial_instance_count=1,
               variant_name='Variant1',
               initial_weight=1,
           )

variant2 = production_variant(
               model_name=model_name2,
               instance_type="ml.m5.xlarge",
               initial_instance_count=1,
               variant_name='Variant2',
               initial_weight=1,
           )
```

 Akhirnya kami siap untuk menerapkan varian produksi ini pada titik akhir SageMaker AI. 

```
endpoint_name = f"DEMO-xgb-churn-pred-{datetime.now():%Y-%m-%d-%H-%M-%S}"
print(f"EndpointName={endpoint_name}")

sm_session.endpoint_from_production_variants(
    name=endpoint_name,
    production_variants=[variant1, variant2]
)
```

### Langkah 2: Panggil model yang digunakan
<a name="model-ab-test-step2"></a>

 Sekarang kami mengirim permintaan ke titik akhir ini untuk mendapatkan kesimpulan secara real time. Kami menggunakan distribusi lalu lintas dan penargetan langsung. 

 Pertama, kami menggunakan distribusi lalu lintas yang kami konfigurasikan pada langkah sebelumnya. Setiap respons inferensi berisi nama varian produksi yang memproses permintaan, sehingga kita dapat melihat bahwa lalu lintas ke dua varian produksi kira-kira sama. 

```
# get a subset of test data for a quick test
!tail -120 test_data/test-dataset-input-cols.csv > test_data/test_sample_tail_input_cols.csv
print(f"Sending test traffic to the endpoint {endpoint_name}. \nPlease wait...")

with open('test_data/test_sample_tail_input_cols.csv', 'r') as f:
    for row in f:
        print(".", end="", flush=True)
        payload = row.rstrip('\n')
        sm_runtime.invoke_endpoint(
            EndpointName=endpoint_name,
            ContentType="text/csv",
            Body=payload
        )
        time.sleep(0.5)

print("Done!")
```

 SageMaker AI memancarkan metrik seperti `Latency` dan `Invocations` untuk setiap varian di Amazon. CloudWatch Untuk daftar lengkap metrik yang dipancarkan SageMaker AI, lihat. [Metrik Amazon SageMaker AI di Amazon CloudWatch](monitoring-cloudwatch.md) Mari kueri CloudWatch untuk mendapatkan jumlah pemanggilan per varian, untuk menunjukkan bagaimana pemanggilan dibagi di seluruh varian secara default: 

![\[Contoh CloudWatch jumlah pemanggilan per varian.\]](http://docs.aws.amazon.com/id_id/sagemaker/latest/dg/images/model-variant-invocations.png)


 Sekarang mari kita memanggil versi tertentu dari model dengan menentukan `Variant1` sebagai `TargetVariant` dalam panggilan ke. `invoke_endpoint` 

```
print(f"Sending test traffic to the endpoint {endpoint_name}. \nPlease wait...")
with open('test_data/test_sample_tail_input_cols.csv', 'r') as f:
    for row in f:
        print(".", end="", flush=True)
        payload = row.rstrip('\n')
        sm_runtime.invoke_endpoint(
            EndpointName=endpoint_name,
            ContentType="text/csv",
            Body=payload,
            TargetVariant="Variant1"
        ) 
        time.sleep(0.5)
```

 Untuk mengonfirmasi bahwa semua pemanggilan baru diproses oleh`Variant1`, kita dapat CloudWatch melakukan kueri untuk mendapatkan jumlah pemanggilan per varian. Kami melihat bahwa untuk pemanggilan terbaru (stempel waktu terbaru), semua permintaan diproses oleh`Variant1`, seperti yang telah kami tentukan. Tidak ada doa yang dibuat untuk. `Variant2` 

![\[Contoh CloudWatch jumlah pemanggilan untuk setiap varian.\]](http://docs.aws.amazon.com/id_id/sagemaker/latest/dg/images/model-invocations-target1.png)


### Langkah 3: Evaluasi kinerja model
<a name="model-ab-test-step3"></a>

 Untuk melihat versi model mana yang berkinerja lebih baik, mari kita evaluasi akurasi, presisi, penarikan, skor F1, dan Penerima yang beroperasi charactersistic/Area di bawah kurva untuk setiap varian. Pertama, mari kita lihat metrik ini untuk`Variant1`: 

![\[Contoh kurva karakteristik operasi penerima untukVariant1.\]](http://docs.aws.amazon.com/id_id/sagemaker/latest/dg/images/model-curve.png)


Sekarang mari kita lihat metrik untuk`Variant2`:

![\[Contoh kurva karakteristik operasi penerima untukVariant2.\]](http://docs.aws.amazon.com/id_id/sagemaker/latest/dg/images/model2-curve.png)


 Untuk sebagian besar metrik yang kami tentukan, `Variant2` berkinerja lebih baik, jadi inilah yang ingin kami gunakan dalam produksi. 

### Langkah 4: Tingkatkan lalu lintas ke model terbaik
<a name="model-ab-test-step4"></a>

 Sekarang kami telah menentukan bahwa `Variant2` kinerjanya lebih baik daripada`Variant1`, kami mengalihkan lebih banyak lalu lintas ke sana. Kami dapat terus menggunakan `TargetVariant` untuk memanggil varian model tertentu, tetapi pendekatan yang lebih sederhana adalah memperbarui bobot yang ditetapkan untuk setiap varian dengan memanggil. [UpdateEndpointWeightsAndCapacities](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_UpdateEndpointWeightsAndCapacities.html) Ini mengubah distribusi lalu lintas ke varian produksi Anda tanpa memerlukan pembaruan ke titik akhir Anda. Ingat dari bagian pengaturan bahwa kami menetapkan bobot varian untuk membagi lalu lintas 50/50. CloudWatch Metrik untuk total pemanggilan untuk setiap varian di bawah ini menunjukkan kepada kita pola pemanggilan untuk setiap varian: 

![\[Contoh CloudWatch metrik untuk total pemanggilan untuk setiap varian.\]](http://docs.aws.amazon.com/id_id/sagemaker/latest/dg/images/model-invocations-even-dist.png)


 Sekarang kita menggeser 75% dari lalu lintas ke `Variant2` dengan menetapkan bobot baru untuk setiap varian menggunakan. `UpdateEndpointWeightsAndCapacities` SageMaker AI sekarang mengirimkan 75% dari permintaan inferensi ke `Variant2` dan sisanya 25% dari permintaan ke`Variant1`. 

```
sm.update_endpoint_weights_and_capacities(
    EndpointName=endpoint_name,
    DesiredWeightsAndCapacities=[
        {
            "DesiredWeight": 25,
            "VariantName": variant1["VariantName"]
        },
        {
            "DesiredWeight": 75,
            "VariantName": variant2["VariantName"]
        }
    ]
)
```

 CloudWatch Metrik untuk pemanggilan total untuk setiap varian menunjukkan kepada kita pemanggilan yang lebih tinggi daripada untuk: `Variant2` `Variant1` 

![\[Contoh CloudWatch metrik untuk pemanggilan total untuk setiap varian.\]](http://docs.aws.amazon.com/id_id/sagemaker/latest/dg/images/model-invocations-75-25.png)


 Kami dapat terus memantau metrik kami, dan ketika kami puas dengan kinerja varian, kami dapat merutekan 100% lalu lintas ke varian itu. Kami gunakan [https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_UpdateEndpointWeightsAndCapacities.html](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_UpdateEndpointWeightsAndCapacities.html)untuk memperbarui tugas lalu lintas untuk varian. Berat untuk `Variant1` diatur ke 0 dan berat untuk `Variant2` diatur ke 1. SageMaker AI sekarang mengirimkan 100% dari semua permintaan inferensi ke`Variant2`. 

```
sm.update_endpoint_weights_and_capacities(
    EndpointName=endpoint_name,
    DesiredWeightsAndCapacities=[
        {
            "DesiredWeight": 0,
            "VariantName": variant1["VariantName"]
        },
        {
            "DesiredWeight": 1,
            "VariantName": variant2["VariantName"]
        }
    ]
)
```

 CloudWatch Metrik untuk total pemanggilan untuk setiap varian menunjukkan bahwa semua permintaan inferensi sedang diproses oleh `Variant2` dan tidak ada permintaan inferensi yang diproses oleh. `Variant1` 

![\[Contoh CloudWatch metrik untuk total pemanggilan untuk setiap varian.\]](http://docs.aws.amazon.com/id_id/sagemaker/latest/dg/images/model-invocations-best-model.png)


 Anda sekarang dapat memperbarui titik akhir dengan aman dan menghapus `Variant1` dari titik akhir Anda. Anda juga dapat terus menguji model baru dalam produksi dengan menambahkan varian baru ke titik akhir Anda dan mengikuti langkah 2 - 4. 

# Menguji model dengan varian bayangan
<a name="model-shadow-deployment"></a>

 Anda dapat menggunakan SageMaker AI Model Shadow Deployment untuk membuat varian bayangan yang berjalan lama untuk memvalidasi komponen kandidat baru dari tumpukan penyajian model Anda sebelum mempromosikannya ke produksi. Diagram berikut menunjukkan bagaimana varian bayangan bekerja secara lebih rinci. 

![\[Detail varian bayangan.\]](http://docs.aws.amazon.com/id_id/sagemaker/latest/dg/images/juxtaposer/shadow-variant.png)


## Menyebarkan varian bayangan
<a name="model-shadow-deployment-deploy"></a>

 Contoh kode berikut menunjukkan bagaimana Anda dapat menerapkan varian bayangan secara terprogram. Ganti contoh *user placeholder text* dalam dengan informasi Anda sendiri. 

1.  Buat dua model SageMaker AI: satu untuk varian produksi Anda, dan satu untuk varian bayangan Anda. 

   ```
   import boto3
   from sagemaker import get_execution_role, Session
                   
   aws_region = "aws-region"
   
   boto_session = boto3.Session(region_name=aws_region)
   sagemaker_client = boto_session.client("sagemaker")
   
   role = get_execution_role()
   
   bucket = Session(boto_session).default_bucket()
   
   model_name1 = "name-of-your-first-model"
   model_name2 = "name-of-your-second-model"
   
   sagemaker_client.create_model(
       ModelName = model_name1,
       ExecutionRoleArn = role,
       Containers=[
           {
               "Image": "ecr-image-uri-for-first-model",
               "ModelDataUrl": "s3-location-of-trained-first-model" 
           }
       ]
   )
   
   sagemaker_client.create_model(
       ModelName = model_name2,
       ExecutionRoleArn = role,
       Containers=[
           {
               "Image": "ecr-image-uri-for-second-model",
               "ModelDataUrl": "s3-location-of-trained-second-model" 
           }
       ]
   )
   ```

1.  Buat konfigurasi titik akhir. Tentukan varian produksi dan bayangan Anda dalam konfigurasi. 

   ```
   endpoint_config_name = name-of-your-endpoint-config
   
   create_endpoint_config_response = sagemaker_client.create_endpoint_config(
       EndpointConfigName=endpoint_config_name,
       ProductionVariants=[
           {
               "VariantName": name-of-your-production-variant,
               "ModelName": model_name1,
               "InstanceType": "ml.m5.xlarge",
               "InitialInstanceCount": 1,
               "InitialVariantWeight": 1,
           }
       ],
       ShadowProductionVariants=[
           {
               "VariantName": name-of-your-shadow-variant,
               "ModelName": model_name2,
               "InstanceType": "ml.m5.xlarge",
               "InitialInstanceCount": 1,
               "InitialVariantWeight": 1,
           }
      ]
   )
   ```

1. Buat titik akhir.

   ```
   create_endpoint_response = sm.create_endpoint(
       EndpointName=name-of-your-endpoint,
       EndpointConfigName=endpoint_config_name,
   )
   ```