Platform for AI (PAI) menyediakan SDK untuk Python yang mencakup API tingkat tinggi yang mudah digunakan. Anda dapat menggunakan SDK ini untuk menerapkan model sebagai layanan inferensi di PAI. Topik ini menjelaskan cara menggunakan PAI SDK untuk Python guna menerapkan layanan inferensi di PAI.
Pengenalan
PAI SDK untuk Python mencakup API tingkat tinggi berikut: pai.model.Model dan pai.predictor.Predictor. Anda dapat menggunakan SDK ini untuk menerapkan model ke Elastic Algorithm Service (EAS) dari PAI dan menguji layanan model tersebut.
Untuk menggunakan SDK dalam menerapkan layanan inferensi, ikuti langkah-langkah berikut:
Tentukan konfigurasi layanan inferensi dalam objek
pai.model.InferenceSpec. Konfigurasi ini mencakup prosesor atau gambar yang ingin Anda gunakan untuk penyebaran layanan.Buat objek
pai.model.Modeldengan menggunakan objekInferenceSpecdan file model.Panggil metode
pai.model.Model.deploy()untuk menerapkan layanan inferensi. Dalam metode ini, tentukan informasi tentang penyebaran layanan, seperti sumber daya yang diperlukan dan nama layanan.Panggil metode
deployuntuk mendapatkan objekpai.predictor.Predictor. Kemudian, panggil metodepredictuntuk mengirim permintaan inferensi.
Kode contoh:
from pai.model import InferenceSpec, Model, container_serving_spec
from pai.image import retrieve, ImageScope
# 1. Gunakan gambar PyTorch yang disediakan oleh PAI untuk inferensi model.
torch_image = retrieve("PyTorch", framework_version="latest",
image_scope=ImageScope.INFERENCE)
# 2. Tentukan konfigurasi layanan inferensi dalam objek InferenceSpec.
inference_spec = container_serving_spec(
# Perintah startup layanan inferensi.
command="python app.py",
source_dir="./src/"
# Gambar yang digunakan untuk inferensi model.
image_uri=torch_image.image_uri,
)
# 3. Buat objek Model.
model = Model(
# Gunakan file model yang disimpan di Bucket OSS.
model_data="oss://<YourBucket>/path-to-model-data",
inference_spec=inference_spec,
)
# 4. Terapkan model sebagai layanan inferensi online di EAS dan dapatkan objek Predictor.
predictor = model.deploy(
service_name="example_torch_service",
instance_type="ecs.c6.xlarge",
)
# 5. Uji layanan inferensi.
res = predictor.predict(data=data)Berikut adalah bagian-bagian yang menjelaskan cara menggunakan SDK untuk Python guna menerapkan layanan inferensi dan memberikan kode contoh terkait.
Konfigurasikan InferenceSpec
Anda dapat menerapkan layanan inferensi dengan menggunakan prosesor atau gambar. Objek pai.model.InferenceSpec mendefinisikan konfigurasi layanan inferensi, seperti prosesor atau gambar yang digunakan untuk penyebaran layanan, jalur penyimpanan layanan, file permintaan pemanasan, dan pengelompokan panggilan prosedur jarak jauh (RPC).
Menerapkan layanan inferensi menggunakan prosesor bawaan
Prosesor adalah paket yang berisi logika prediksi online. Anda dapat menggunakan prosesor untuk langsung menerapkan model sebagai layanan inferensi. PAI menyediakan prosesor bawaan yang mendukung format model pembelajaran mesin umum, seperti TensorFlow SavedModel, PyTorch TorchScript, XGBoost, LightGBM, dan PMML. Untuk informasi lebih lanjut, lihat Prosesor Bawaan.
Contoh konfigurasi
InferenceSpec:# Gunakan prosesor TensorFlow bawaan. tf_infer_spec = InferenceSpec(processor="tensorflow_cpu_2.3") # Gunakan prosesor PyTorch bawaan. tf_infer_spec = InferenceSpec(processor="pytorch_cpu_1.10") # Gunakan prosesor XGBoost bawaan. xgb_infer_spec = InferenceSpec(processor="xgboost")Anda dapat mengonfigurasi fitur tambahan untuk layanan inferensi dalam objek
InferenceSpec, seperti permintaan pemanasan dan RPC. Untuk informasi tentang konfigurasi lanjutan, lihat Parameter Layanan Model.# Konfigurasikan properti InferenceSpec. tf_infer_spec.warm_up_data_path = "oss://<YourOssBucket>/path/to/warmup-data" # Tentukan jalur file permintaan pemanasan. tf_infer_spec.metadata.rpc.keepalive=1000 # Tentukan waktu pemrosesan maksimum untuk satu permintaan. print(tf_infer_spec.warm_up_data_path) print(tf_infer_spec.metadata.rpc.keepalive)
Menerapkan layanan inferensi menggunakan gambar
Prosesor menyederhanakan prosedur penyebaran model, tetapi tidak dapat memenuhi persyaratan penyebaran kustom, terutama ketika model atau layanan inferensi memiliki dependensi yang kompleks. Untuk mengatasi masalah ini, PAI mendukung penyebaran model yang fleksibel menggunakan gambar.
Anda dapat mengemas kode dan dependensi model ke dalam gambar Docker dan mendorong gambar Docker tersebut ke Alibaba Cloud Container Registry (ACR). Kemudian, Anda dapat membuat objek InferenceSpec berdasarkan gambar Docker tersebut.
from pai.model import InferenceSpec, container_serving_spec # Panggil metode container_serving_spec untuk membuat objek InferenceSpec dari gambar. container_infer_spec = container_serving_spec( # Gambar yang digunakan untuk menjalankan layanan inferensi. image_uri="<CustomImageUri>", # Port tempat layanan inferensi mendengarkan. Permintaan inferensi diteruskan ke port ini oleh PAI. port=8000, environment_variables=environment_variables, # Perintah startup layanan inferensi. command=command, # Paket Python yang diperlukan oleh layanan inferensi. requirements=[ "scikit-learn", "fastapi==0.87.0", ], ) print(container_infer_spec.to_dict()) m = Model( model_data="oss://<YourOssBucket>/path-to-tensorflow-saved-model", inference_spec=custom_container_infer_spec, ) p = m.deploy( instance_type="ecs.c6.xlarge" )Jika Anda ingin menggunakan gambar kustom, integrasikan kode inferensi yang telah Anda siapkan ke dalam kontainer, buat gambar, dan dorong gambar tersebut ke ACR. PAI SDK untuk Python menyederhanakan proses ini. Anda dapat menambahkan kode Anda ke gambar dasar untuk membangun gambar kustom. Dengan cara ini, Anda tidak perlu membangun gambar dari awal. Dalam metode
pai.model.container_serving_spec(), Anda dapat mengatur parametersource_dirke direktori lokal yang berisi kode inferensi. SDK secara otomatis mengemas dan mengunggah direktori tersebut ke Bucket OSS, serta memasang jalur OSS ke kontainer. Anda dapat menentukan perintah startup untuk memulai layanan inferensi.from pai.model import InferenceSpec inference_spec = container_serving_spec( # Direktori lokal yang berisi kode inferensi. Direktori tersebut diunggah ke Bucket OSS, dan jalur OSS dipasang ke kontainer. Jalur kontainer default: /ml/usercode/. source_dir="./src", # Perintah startup layanan inferensi. Jika Anda menentukan parameter source_dir, direktori /ml/usercode digunakan sebagai direktori kerja kontainer secara default. command="python run.py", image_uri="<ServingImageUri>", requirements=[ "fastapi", "uvicorn", ] ) print(inference_spec.to_dict())Jika Anda ingin menambahkan kode atau model ke kontainer, Anda dapat memanggil metode
pai.model.InferenceSpec.mount()untuk memasang direktori lokal atau jalur OSS ke kontainer.# Unggah data lokal ke OSS dan pasang jalur OSS ke direktori /ml/tokenizers di kontainer. inference_spec.mount("./bert_tokenizers/", "/ml/tokenizers/") # Pasang jalur OSS ke direktori /ml/data di kontainer. inference_spec.mount("oss://<YourOssBucket>/path/to/data/", "/ml/data/")Dapatkan Gambar Publik yang Disediakan oleh PAI
PAI menyediakan beberapa gambar inferensi berdasarkan kerangka pembelajaran mesin umum, seperti
TensorFlow,PyTorch, danXGBoost. Anda dapat mengatur parameterimage_scopeke ImageScope.INFERENCE dalam metodepai.image.list_imagesdanpai.image.retrieveuntuk mendapatkan gambar inferensi tersebut.from pai.image import retrieve, ImageScope, list_images # Dapatkan semua gambar inferensi PyTorch yang disediakan oleh PAI. for image_info in list_images(framework_name="PyTorch", image_scope=ImageScope.INFERENCE): print(image_info) # Dapatkan gambar PyTorch 1.12 untuk inferensi berbasis CPU. retrieve(framework_name="PyTorch", framework_version="1.12", image_scope=ImageScope.INFERENCE) # Dapatkan gambar PyTorch 1.12 untuk inferensi berbasis GPU. retrieve(framework_name="PyTorch", framework_version="1.12", accelerator_type="GPU", image_scope=ImageScope.INFERENCE) # Dapatkan gambar yang mendukung versi terbaru PyTorch untuk inferensi berbasis GPU. retrieve(framework_name="PyTorch", framework_version="latest", accelerator_type="GPU", image_scope=ImageScope.INFERENCE)
Menerapkan layanan inferensi dan mengirim permintaan inferensi
Menerapkan layanan inferensi
Buat objek pai.model.Model menggunakan objek pai.model.InferenceSpec dan parameter model_data. Kemudian, panggil metode deploy untuk menerapkan model. Parameter model_data menentukan jalur model. Nilai parameter ini bisa berupa URI OSS atau jalur lokal. Jika Anda menentukan jalur lokal, file model yang disimpan di jalur tersebut akan diunggah ke Bucket OSS dan kemudian dimuat dari Bucket OSS ke layanan inferensi.
Dalam metode deploy, tentukan parameter layanan inferensi, seperti sumber daya yang diperlukan, jumlah instans, dan nama layanan. Untuk informasi tentang konfigurasi lanjutan, lihat Parameter Layanan Model.
from pai.model import Model, InferenceSpec
from pai.predictor import Predictor
model = Model(
# Jalur model, yang bisa berupa URI OSS atau jalur lokal. Jika Anda menentukan jalur lokal, file model yang disimpan di jalur tersebut diunggah ke Bucket OSS secara default.
model_data="oss://<YourBucket>/path-to-model-data",
inference_spec=inference_spec,
)
# Terapkan layanan inferensi di EAS.
predictor = m.deploy(
# Nama layanan inferensi.
service_name="example_xgb_service",
# Jenis instans yang digunakan untuk layanan inferensi.
instance_type="ecs.c6.xlarge",
# Jumlah instans.
instance_count=2,
# Opsional. Gunakan grup sumber daya khusus untuk penyebaran layanan. Secara default, grup sumber daya publik digunakan.
# resource_id="<YOUR_EAS_RESOURCE_GROUP_ID>",
options={
"metadata.rpc.batching": True,
"metadata.rpc.keepalive": 50000,
"metadata.rpc.max_batch_size": 16,
"warm_up_data_path": "oss://<YourOssBucketName>/path-to-warmup-data",
},
)Anda juga dapat menggunakan parameter resource_config untuk menentukan jumlah sumber daya yang digunakan untuk penyebaran layanan, seperti jumlah vCPU dan ukuran memori setiap instans layanan.
from pai.model import ResourceConfig
predictor = m.deploy(
service_name="dedicated_rg_service",
# Tentukan jumlah vCPU dan ukuran memori setiap instans layanan.
# Dalam contoh ini, setiap instans layanan memiliki dua vCPU dan 4.000 MB memori.
resource_config=ResourceConfig(
cpu=2,
memory=4000,
),
)Kirim permintaan ke layanan inferensi
Dalam metode pai.model.Model.deploy, panggil operasi API EAS untuk menerapkan layanan inferensi. Objek pai.predictor.Predictor yang sesuai dikembalikan. Anda dapat menggunakan metode predict dan raw_predict dalam objek Predictor untuk mengirim permintaan inferensi.
Input dan output metode pai.predictor.Predictor.raw_predict tidak perlu diproses oleh serializer.
from pai.predictor import Predictor, EndpointType
# Terapkan layanan inferensi.
predictor = model.deploy(
instance_type="ecs.c6.xlarge",
service_name="example_xgb_service",
)
# Layanan inferensi ke mana permintaan inferensi dikirim.
predictor = Predictor(
service_name="example_xgb_service",
# Secara default, Anda dapat mengakses layanan inferensi melalui Internet. Untuk mengakses layanan inferensi melalui titik akhir virtual private cloud (VPC), Anda dapat mengatur tipe titik akhir ke INTRANET. Dalam hal ini, klien harus diterapkan di VPC.
# endpoint_type=EndpointType.INTRANET
)
# Gunakan metode predict untuk mengirim permintaan ke layanan inferensi dan mendapatkan hasilnya. Input dan output diproses oleh serializer.
res = predictor.predict(data_in_nested_list)
# Gunakan metode raw_predict untuk mengirim permintaan ke layanan inferensi secara lebih fleksibel.
response: RawResponse = predictor.raw_predict(
# Data input tipe bytes dan objek mirip file dapat langsung dilewatkan ke badan permintaan HTTP.
# Data lainnya diserialisasi menjadi data berformat JSON dan kemudian dilewatkan ke badan permintaan HTTP.
data=data_in_nested_list
# path="predict", # Jalur permintaan HTTP. Nilai default: "/".
# headers=dict(), # Header permintaan.
# method="POST", # Metode permintaan HTTP.
# timeout=30, # Batas waktu permintaan. Unit: detik.
)
# Dapatkan badan HTTP dan header yang dikembalikan.
print(response.content, response.headers)
# Deserialisasi data berformat JSON yang dikembalikan menjadi objek Python.
print(response.json())
# Hentikan layanan inferensi.
predictor.stop_service()
# Mulai layanan inferensi.
predictor.start_service()
# Hapus layanan inferensi.
predictor.delete_service()Gunakan serializer untuk memproses input dan output
Saat Anda memanggil metode pai.predictor.Predictor.predict untuk inferensi model, Anda harus menyerilisasi data Python input ke dalam format data yang didukung oleh layanan inferensi dan mendeserialisasi hasil yang dikembalikan menjadi objek Python yang dapat dibaca atau dioperasikan. Objek Predictor menggunakan kelas serializer untuk melakukan serialisasi dan deserialisasi.
Saat Anda memanggil metode
predict(data=<PredictionData>), parameterdatamenyerilisasi data permintaan ke dalam formatbytesdengan memanggil metodeserilizer.serialize. Kemudian, data permintaan yang dikonversi dilewatkan ke layanan inferensi melalui badan permintaan HTTP.Saat layanan inferensi mengembalikan respons HTTP, objek
Predictormendeserialisasi respons dengan memanggil metodeserializer.deserialize. Anda dapat mendapatkan respons yang dikonversi dari metodepredict.
PAI SDK untuk Python menyediakan beberapa serializer bawaan untuk format data umum. Serializer ini dapat memproses input dan output prosesor bawaan yang disediakan oleh PAI.
JsonSerializer
JsonSerializermenyerilisasi objek menjadi stringJSONdan mendeserialisasi string JSON menjadi objek. Inputdatadari metodepredictdapat berupaNumPy arrayataulist. MetodeJsonSerializer.serializemenyerilisasi data input menjadi stringJSON. MetodeJsonSerializer.deserializemendeserialisasi string JSON yang dikembalikan menjadi objek Python.Prosesor bawaan tertentu, seperti prosesor XGBoost dan prosesor PMML, hanya menerima dan mengembalikan data berformat JSON. Secara default, JsonSerializer digunakan untuk memproses input dan output prosesor ini.
from pai.serializers import JsonSerializer
# Dalam metode deploy, tentukan serializer yang ingin Anda gunakan.
p = Model(
inference_spec=InferenceSpec(processor="xgboost"),
model_data="oss://<YourOssBucket>/path-to-xgboost-model"
).deploy(
instance_type="ecs.c6.xlarge",
# Opsional. Secara default, JsonSerializer digunakan untuk memproses input dan output prosesor XGBoost.
serializer=JsonSerializer()
)
# Anda juga dapat menentukan serializer saat membuat objek Predictor.
p = Predictor(
service_name="example_xgb_service"
serializer=JsonSerializer(),
)
# Hasil yang dikembalikan adalah daftar.
res = p.predict([[2,3,4], [4,5,6]])TensorFlowSerializer
Anda dapat menggunakan prosesor TensorFlow bawaan untuk menerapkan model TensorFlow dalam format SavedModel di PAI. Input dan output layanan TensorFlow adalah pesan protocol buffers. Untuk informasi tentang format data, lihat tf_predict.proto.
PAI SDK untuk Python menyediakan TensorFlowSerializer bawaan, yang memungkinkan Anda mengirim permintaan inferensi sebagai NumPy array. Serializer ini menyerilisasi NumPy arrays menjadi pesan protocol buffers dan mendeserialisasi pesan protocol buffers yang dikembalikan menjadi NumPy arrays.
# Terapkan layanan model menggunakan prosesor TensorFlow.
tf_predictor = Model(
inference_spec=InferenceSpec(processor="tensorflow_cpu_2.7"),
model_data="oss://<YourOssBucket>/path-to-tensorflow-saved-model"
).deploy(
instance_type="ecs.c6.xlarge",
# Opsional. Secara default, TensorFlowSerializer digunakan untuk memproses input dan output prosesor TensorFlow.
# serializer=TensorFlowSerializer(),
)
# Anda dapat memperoleh tanda tangan layanan dengan memanggil operasi API.
print(tf_predictor.inspect_signature_def())
# Input prosesor TensorFlow adalah tipe kamus. Kunci kamus adalah nama tanda tangan input. Nilai kamus adalah data input spesifik.
tf_result = tf_predictor.predict(data={
"flatten_input": numpy.zeros(28*28*2).reshape((-1, 28, 28))
})
assert result["dense_1"].shape == (2, 10)PyTorchSerializer
Anda dapat menggunakan prosesor PyTorch bawaan untuk menerapkan model PyTorch dalam format TorchScript di PAI. Input dan output layanan PyTorch adalah pesan protocol buffers. Untuk informasi tentang format data, lihat tf_predict.proto.
PAI SDK untuk Python menyediakan PyTorchSerializer bawaan, yang memungkinkan Anda mengirim permintaan inferensi sebagai NumPy array. Serializer ini menyerilisasi NumPy arrays menjadi pesan protocol buffers dan mendeserialisasi pesan protocol buffers yang dikembalikan menjadi .
# Terapkan layanan model menggunakan prosesor PyTorch.
torch_predictor = Model(
inference_spec=InferenceSpec(processor="pytorch_cpu_1.10"),
model_data="oss://<YourOssBucket>/path-to-torch_script-model"
).deploy(
instance_type="ecs.c6.xlarge",
# Opsional. Secara default, PyTorchSerializer digunakan untuk memproses input dan output prosesor PyTorch.
# serializer=PyTorchSerializer(),
)
#1. Konversikan data input ke format yang didukung oleh layanan model.
#2. Gunakan daftar atau tupel untuk input ganda. Setiap elemen adalah NumPy array.
torch_result = torch_predictor.predict(data=numpy.zeros(28 * 28 * 2).reshape((-1, 28, 28)))
assert torch_result.shape == (2, 10)Serializer Kustom
Anda dapat menggunakan kelas pai.serializers.SerializerBase untuk membuat serializer kustom berdasarkan format data yang didukung oleh layanan inferensi.
Dalam bagian ini, NumpySerializer kustom digunakan sebagai contoh untuk menunjukkan cara serializer melakukan serialisasi dan deserialisasi.
Klien: Metode
NumpySerializer.serializerdipanggil untuk menyeriahkan inputNumPy arrayataupandas DataFrameke dalam format.npy. Data yang telah dikonversi dikirimkan ke server.Server: Layanan inferensi mendeserialisasi data yang diterima dalam format
.npy, menghasilkan hasil inferensi, dan kemudian menyerilisasi hasil tersebut ke dalam format.npy. Hasil tersebut dikembalikan ke klien setelah diserialisasi.Klien: Metode
NumpySerializer.deserializedipanggil untuk mendeserialisasi hasil yang dikembalikan menjadiNumPy array.
Menerapkan layanan inferensi di lingkungan lokal
PAI SDK untuk Python juga memungkinkan Anda menerapkan layanan inferensi di lingkungan lokal menggunakan gambar kustom. Untuk menjalankan layanan inferensi di lingkungan lokal, atur parameter instance_type ke local dalam metode model.deploy. SDK menggunakan Docker container untuk menjalankan layanan inferensi pada mesin lokal Anda. Model secara otomatis diunduh dari Bucket OSS dan dipasang ke kontainer yang berjalan di mesin lokal Anda.
from pai.predictor import LocalPredictor
p: LocalPredictor = model.deploy(
# Tentukan untuk menerapkan layanan inferensi di lingkungan lokal.
instance_type="local",
serializer=JsonSerializer()
)
p.predict(data)
# Hapus kontainer Docker.
p.delete_service()Referensi
Untuk informasi tentang cara menggunakan PAI SDK untuk Python guna melatih dan menerapkan model PyTorch, lihat Latih dan Terapkan Model PyTorch.