

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

# Siapkan Model untuk Kompilasi
<a name="neo-compilation-preparing-model"></a>

SageMaker Neo membutuhkan model pembelajaran mesin untuk memenuhi bentuk data input tertentu. Bentuk input yang diperlukan untuk kompilasi tergantung pada kerangka pembelajaran mendalam yang Anda gunakan. Setelah bentuk input model Anda diformat dengan benar, simpan model Anda sesuai dengan persyaratan di bawah ini. Setelah Anda memiliki model yang disimpan, kompres artefak model.

**Topics**
+ [Bentuk data input apa yang diharapkan SageMaker Neo?](#neo-job-compilation-expected-inputs)
+ [Model Menyimpan untuk SageMaker Neo](#neo-job-compilation-how-to-save-model)

## Bentuk data input apa yang diharapkan SageMaker Neo?
<a name="neo-job-compilation-expected-inputs"></a>

Sebelum Anda mengkompilasi model Anda, pastikan model Anda diformat dengan benar. Neo mengharapkan nama dan bentuk input data yang diharapkan untuk model terlatih Anda dengan format JSON atau format daftar. Input yang diharapkan adalah kerangka kerja khusus. 

Di bawah ini adalah bentuk input yang SageMaker diharapkan Neo:

### Keras
<a name="collapsible-section-1"></a>

Tentukan nama dan bentuk (format NCHW) dari input data yang diharapkan menggunakan format kamus untuk model terlatih Anda. Perhatikan bahwa sementara artefak model Keras harus diunggah dalam format NHWC (channel-last), DataInputConfig harus ditentukan dalam format NCHW (channel-first). Format kamus yang diperlukan adalah sebagai berikut: 
+ Untuk satu masukan: `{'input_1':[1,3,224,224]}`
+ Untuk dua input: `{'input_1': [1,3,224,224], 'input_2':[1,3,224,224]}`

### MXNet/ONNX
<a name="collapsible-section-2"></a>

Tentukan nama dan bentuk (format NCHW) dari input data yang diharapkan menggunakan format kamus untuk model terlatih Anda. Format kamus yang diperlukan adalah sebagai berikut:
+ Untuk satu masukan: `{'data':[1,3,1024,1024]}`
+ Untuk dua input: `{'var1': [1,1,28,28], 'var2':[1,1,28,28]}`

### PyTorch
<a name="collapsible-section-3"></a>

Untuk PyTorch model, Anda tidak perlu memberikan nama dan bentuk input data yang diharapkan jika Anda memenuhi kedua kondisi berikut:
+ Anda membuat file definisi model dengan menggunakan PyTorch 2.0 atau yang lebih baru. Untuk informasi selengkapnya tentang cara membuat file definisi, lihat [PyTorch](#how-to-save-pytorch) bagian di bawah Meny * impan Model untuk SageMaker Neo*.
+ Anda sedang mengkompilasi model Anda untuk instance cloud. Untuk informasi selengkapnya tentang jenis instans yang SageMaker didukung Neo, lihat[Jenis dan Kerangka Instance yang Didukung](neo-supported-cloud.md).

Jika Anda memenuhi kondisi ini, SageMaker Neo mendapatkan konfigurasi input dari file definisi model (.pt atau .pth) yang Anda buat. PyTorch

Jika tidak, Anda harus melakukan hal berikut:

Tentukan nama dan bentuk (format NCHW) dari input data yang diharapkan menggunakan format kamus untuk model terlatih Anda. Atau, Anda dapat menentukan bentuk hanya menggunakan format daftar. Format kamus yang diperlukan adalah sebagai berikut:
+ Untuk satu masukan dalam format kamus: `{'input0':[1,3,224,224]}`
+ Untuk satu input dalam format daftar: `[[1,3,224,224]]`
+ Untuk dua input dalam format kamus: `{'input0':[1,3,224,224], 'input1':[1,3,224,224]}`
+ Untuk dua input dalam format daftar: `[[1,3,224,224], [1,3,224,224]]`

### TensorFlow
<a name="collapsible-section-4"></a>

Tentukan nama dan bentuk (format NHWC) dari input data yang diharapkan menggunakan format kamus untuk model terlatih Anda. Format kamus yang diperlukan adalah sebagai berikut:
+ Untuk satu masukan: `{'input':[1,1024,1024,3]}`
+ Untuk dua input: `{'data1': [1,28,28,1], 'data2':[1,28,28,1]}`

### TFLite
<a name="collapsible-section-5"></a>

Tentukan nama dan bentuk (format NHWC) dari input data yang diharapkan menggunakan format kamus untuk model terlatih Anda. Format kamus yang diperlukan adalah sebagai berikut:
+ Untuk satu masukan: `{'input':[1,224,224,3]}`

**catatan**  
SageMaker Neo hanya mendukung TensorFlow Lite untuk target perangkat tepi. Untuk daftar target perangkat tepi SageMaker Neo yang didukung, lihat [Perangkat](neo-supported-devices-edge-devices.md#neo-supported-edge-devices) halaman SageMaker Neo. Untuk daftar target instance cloud SageMaker Neo yang didukung, lihat [Jenis dan Kerangka Instance yang Didukung](neo-supported-cloud.md) halaman SageMaker Neo.

### XGBoost
<a name="collapsible-section-6"></a>

Nama dan bentuk data input tidak diperlukan.

## Model Menyimpan untuk SageMaker Neo
<a name="neo-job-compilation-how-to-save-model"></a>

Contoh kode berikut menunjukkan cara menyimpan model Anda agar kompatibel dengan Neo. Model harus dikemas sebagai file tar terkompresi (`*.tar.gz`).

### Keras
<a name="how-to-save-tf-keras"></a>

Model Keras memerlukan satu file definisi model (`.h5`).

Ada dua opsi untuk menyimpan model Keras Anda agar kompatibel dengan SageMaker Neo:

1. Ekspor ke `.h5` format dengan`model.save("<model-name>", save_format="h5")`.

1. Bekukan `SavedModel` setelah mengekspor.

Di bawah ini adalah contoh cara mengekspor `tf.keras` model sebagai grafik beku (opsi dua):

```
import os
import tensorflow as tf
from tensorflow.keras.applications.resnet50 import ResNet50
from tensorflow.keras import backend

tf.keras.backend.set_learning_phase(0)
model = tf.keras.applications.ResNet50(weights='imagenet', include_top=False, input_shape=(224, 224, 3), pooling='avg')
model.summary()

# Save as a SavedModel
export_dir = 'saved_model/'
model.save(export_dir, save_format='tf')

# Freeze saved model
input_node_names = [inp.name.split(":")[0] for inp in model.inputs]
output_node_names = [output.name.split(":")[0] for output in model.outputs]
print("Input names: ", input_node_names)
with tf.Session() as sess:
    loaded = tf.saved_model.load(sess, export_dir=export_dir, tags=["serve"]) 
    frozen_graph = tf.graph_util.convert_variables_to_constants(sess,
                                                                sess.graph.as_graph_def(),
                                                                output_node_names)
    tf.io.write_graph(graph_or_graph_def=frozen_graph, logdir=".", name="frozen_graph.pb", as_text=False)

import tarfile
tar = tarfile.open("frozen_graph.tar.gz", "w:gz")
tar.add("frozen_graph.pb")
tar.close()
```

**Awas**  
Jangan mengekspor model Anda dengan `SavedModel` kelas yang menggunakan`model.save(<path>, save_format='tf')`. Format ini cocok untuk pelatihan, tetapi tidak cocok untuk inferensi.

### MXNet
<a name="how-to-save-mxnet"></a>

Model MXnet harus disimpan sebagai file simbol tunggal `*-symbol.json` dan parameter `*.params files` tunggal.

------
#### [ Gluon Models ]

Tentukan jaringan saraf menggunakan `HybridSequential` Kelas. Ini akan menjalankan kode dalam gaya pemrograman simbolik (sebagai lawan dari pemrograman imperatif).

```
from mxnet import nd, sym
from mxnet.gluon import nn

def get_net():
    net = nn.HybridSequential()  # Here we use the class HybridSequential.
    net.add(nn.Dense(256, activation='relu'),
            nn.Dense(128, activation='relu'),
            nn.Dense(2))
    net.initialize()
    return net

# Define an input to compute a forward calculation. 
x = nd.random.normal(shape=(1, 512))
net = get_net()

# During the forward calculation, the neural network will automatically infer
# the shape of the weight parameters of all the layers based on the shape of
# the input.
net(x)
                        
# hybridize model
net.hybridize()
net(x)

# export model
net.export('<model_name>') # this will create model-symbol.json and model-0000.params files

import tarfile
tar = tarfile.open("<model_name>.tar.gz", "w:gz")
for name in ["<model_name>-0000.params", "<model_name>-symbol.json"]:
    tar.add(name)
tar.close()
```

Untuk informasi selengkapnya tentang model hibridisasi, lihat dokumentasi hibridisasi [ MXnet. ](https://mxnet.apache.org/versions/1.7.0/api/python/docs/tutorials/packages/gluon/blocks/hybridize.html)

------
#### [ Gluon Model Zoo (GluonCV) ]

Model kebun binatang model GluonCV hadir dengan pra-hibridisasi. Jadi Anda bisa mengekspornya saja.

```
import numpy as np
import mxnet as mx
import gluoncv as gcv
from gluoncv.utils import export_block
import tarfile

net = gcv.model_zoo.get_model('<model_name>', pretrained=True) # For example, choose <model_name> as resnet18_v1
export_block('<model_name>', net, preprocess=True, layout='HWC')

tar = tarfile.open("<model_name>.tar.gz", "w:gz")

for name in ["<model_name>-0000.params", "<model_name>-symbol.json"]:
    tar.add(name)
tar.close()
```

------
#### [ Non Gluon Models ]

Semua model non-Gluon saat disimpan ke penggunaan disk `*-symbol` dan `*.params` file. Karena itu mereka sudah dalam format yang benar untuk Neo.

```
# Pass the following 3 parameters: sym, args, aux
mx.model.save_checkpoint('<model_name>',0,sym,args,aux) # this will create <model_name>-symbol.json and <model_name>-0000.params files

import tarfile
tar = tarfile.open("<model_name>.tar.gz", "w:gz")

for name in ["<model_name>-0000.params", "<model_name>-symbol.json"]:
    tar.add(name)
tar.close()
```

------

### PyTorch
<a name="how-to-save-pytorch"></a>

PyTorch model harus disimpan sebagai file definisi (`.pt`atau`.pth`) dengan tipe data input dari. `float32`

Untuk menyimpan model Anda, gunakan `torch.jit.trace` metode yang diikuti oleh `torch.save` metode. Proses ini menyimpan objek ke file disk dan secara default menggunakan python pickle (`pickle_module=pickle`) untuk menyimpan objek dan beberapa metadata. Selanjutnya, konversi model yang disimpan ke file tar terkompresi.

```
import torchvision
import torch

model = torchvision.models.resnet18(pretrained=True)
model.eval()
inp = torch.rand(1, 3, 224, 224)
model_trace = torch.jit.trace(model, inp)

# Save your model. The following code saves it with the .pth file extension
model_trace.save('model.pth')

# Save as a compressed tar file
import tarfile
with tarfile.open('model.tar.gz', 'w:gz') as f:
    f.add('model.pth')
f.close()
```

Jika Anda menyimpan model Anda dengan PyTorch 2.0 atau yang lebih SageMaker baru, Neo memperoleh konfigurasi input untuk model (nama dan bentuk untuk inputnya) dari file definisi. Dalam hal ini, Anda tidak perlu menentukan konfigurasi input data ke SageMaker AI saat Anda mengkompilasi model.

Jika Anda ingin mencegah SageMaker Neo memperoleh konfigurasi input, Anda dapat mengatur `_store_inputs` parameter `torch.jit.trace` ke`False`. Jika Anda melakukan ini, Anda harus menentukan konfigurasi input data ke SageMaker AI saat Anda mengkompilasi model.

Untuk informasi lebih lanjut tentang `torch.jit.trace` metode ini, lihat [ TORCH.JIT.TRACE ](https://pytorch.org/docs/stable/generated/torch.jit.trace.html#torch.jit.trace) dalam PyTorch dokumentasi.

### TensorFlow
<a name="how-to-save-tf"></a>

TensorFlow membutuhkan satu `.pb` atau satu `.pbtxt` file dan direktori variabel yang berisi variabel. Untuk model beku, hanya satu `.pb` atau `.pbtxt` file yang diperlukan.

Contoh kode berikut menunjukkan cara menggunakan perintah tar Linux untuk mengompres model Anda. Jalankan yang berikut ini di terminal Anda atau di notebook Jupyter (jika Anda menggunakan notebook Jupyter, masukkan perintah `!` ajaib di awal pernyataan):

```
# Download SSD_Mobilenet trained model
!wget http://download.tensorflow.org/models/object_detection/ssd_mobilenet_v2_coco_2018_03_29.tar.gz

# unzip the compressed tar file
!tar xvf ssd_mobilenet_v2_coco_2018_03_29.tar.gz

# Compress the tar file and save it in a directory called 'model.tar.gz'
!tar czvf model.tar.gz ssd_mobilenet_v2_coco_2018_03_29/frozen_inference_graph.pb
```

Bendera perintah yang digunakan dalam contoh ini mencapai hal berikut:
+ `c`: Buat arsip
+ `z`: Kompres arsip dengan gzip
+ `v`: Tampilkan kemajuan arsip
+ `f`: Tentukan nama file arsip

### Built-In Penaksir
<a name="how-to-save-built-in"></a>

Built-in estimator dibuat oleh wadah khusus kerangka kerja atau wadah khusus algoritma. Objek estimator untuk algoritma bawaan dan estimator khusus kerangka kerja menyimpan model dalam format yang benar untuk Anda saat Anda melatih model menggunakan metode bawaan. `.fit`

Misalnya, Anda dapat menggunakan a `sagemaker.TensorFlow` untuk mendefinisikan TensorFlow estimator:

```
from sagemaker.train import ModelTrainer
from sagemaker.train.configs import Compute, SourceCode

model_trainer = ModelTrainer(
    training_image='insert appropriate TensorFlow training image URI',
    role=role,  #param role can be arn of a sagemaker execution role
    compute=Compute(instance_type='ml.c4.xlarge', instance_count=2),
    hyperparameters={
        'training_steps': '1000',
        'evaluation_steps': '100',
    },
    source_code=SourceCode(entry_script='mnist.py'),
)
```

Kemudian latih model dengan `.train` metode:

```
model_trainer.train(inputs)
```

Sebelum akhirnya mengkompilasi model dengan `compile_model` metode build in:

```
# Neo compilation in V3 uses ModelBuilder.optimize() with compilation_config
from sagemaker.serve import ModelBuilder

# Specify output path of the compiled model
output_path = '/'.join(model_trainer.output_path.split('/')[:-1])

model_builder = ModelBuilder(
    model=model_trainer,
    role_arn=role,
    instance_type='ml.c5.xlarge',
)
optimized_model = model_builder.optimize(
    instance_type='ml.c5.xlarge',
    output_path=output_path,
    compilation_config={
        'OverrideEnvironment': {
            'OPTION_TARGET_INSTANCE_FAMILY': 'ml_c5',
            'OPTION_FRAMEWORK': 'tensorflow',
            'OPTION_FRAMEWORK_VERSION': '1.15.3',
        },
    },
)
```

Anda juga dapat menggunakan `sagemaker.estimator.Estimator` Kelas untuk menginisialisasi objek estimator untuk pelatihan dan kompilasi algoritma bawaan dengan `compile_model` metode dari Python SDK: SageMaker 

```
from sagemaker.core import image_uris
from sagemaker.core.helper.session_helper import Session
from sagemaker.train import ModelTrainer
from sagemaker.train.configs import Compute, InputData

sagemaker_session = Session()
aws_region = sagemaker_session.boto_region_name

# Specify built-in algorithm training image
training_image = image_uris.retrieve(framework='image-classification', 
                          region=aws_region, image_scope='training')

# Create ModelTrainer object for training
model_trainer = ModelTrainer(training_image=training_image,
                                          role=role,  #param role can be arn of a sagemaker execution role
                                          compute=Compute(
                                              instance_count=1,
                                              instance_type='ml.p3.8xlarge',
                                              volume_size_in_gb=50,
                                          ),
                                          output_data_config={'s3_output_path': s3_training_output_location},
                                          base_job_name='image-classification-training'
                                          )
                                          
# Setup the input data_channels to be used later for training.                                          
train_data = InputData(channel_name='train', data_source=s3_training_data_location)
validation_data = InputData(channel_name='validation', data_source=s3_validation_data_location)
data_channels = [train_data, validation_data]

# Train model
model_trainer.train(inputs=data_channels)

# Neo compilation in V3 uses ModelBuilder.optimize() with compilation_config
from sagemaker.serve import ModelBuilder

model_builder = ModelBuilder(
    model=model_trainer,
    role_arn=role,
    instance_type='ml.c5.xlarge',
)
optimized_model = model_builder.optimize(
    instance_type='ml.c5.xlarge',
    output_path=s3_compilation_output_location,
    compilation_config={
        'OverrideEnvironment': {
            'OPTION_TARGET_INSTANCE_FAMILY': 'ml_c5',
            'OPTION_FRAMEWORK': 'mxnet',
            'OPTION_FRAMEWORK_VERSION': '1.7',
        },
    },
)
```

Untuk informasi selengkapnya tentang mengkompilasi model dengan SageMaker Python SDK, lihat[Mengkompilasi Model (Amazon SageMaker AI SDK)](neo-job-compilation-sagemaker-sdk.md).