Elastic Algorithm Service (EAS) menyediakan PyTorch processor bawaan untuk menerapkan model PyTorch standar dalam format TorchScript sebagai layanan online. Topik ini menjelaskan cara menerapkan dan memanggil layanan model PyTorch.
Panduan versi PyTorch processor
PyTorch mendukung beberapa versi, termasuk versi GPU dan CPU. Tabel berikut mencantumkan nama processor untuk setiap versi.
|
Processor name |
PyTorch version |
Supports GPU version |
|
pytorch_cpu_1.6 |
Pytorch 1.6 |
No |
|
pytorch_cpu_1.7 |
Pytorch 1.7 |
No |
|
pytorch_cpu_1.9 |
Pytorch 1.9 |
No |
|
pytorch_cpu_1.10 |
Pytorch 1.10 |
No |
|
pytorch_gpu_1.6 |
Pytorch 1.6 |
Yes |
|
pytorch_gpu_1.7 |
Pytorch 1.7 |
Yes |
|
pytorch_gpu_1.9 |
Pytorch 1.9 |
Yes |
|
pytorch_gpu_1.10 |
Pytorch 1.10 |
Yes |
Langkah 1: Terapkan layanan
Saat menggunakan klien eascmd untuk menerapkan layanan model PyTorch, atur parameter processor ke salah satu nama PyTorch processor dari tabel di atas. Kode berikut menampilkan contoh file konfigurasi layanan.
{
"name": "pytorch_resnet_example",
"model_path": "http://examplebucket.oss-cn-shanghai.aliyuncs.com/models/resnet18.pt",
"processor": "pytorch_cpu_1.6",
"metadata": {
"cpu": 1,
"instance": 1,
"memory": 1000
}
}
Untuk informasi selengkapnya tentang penggunaan tool klien dalam penerapan layanan, lihat Penerapan layanan: EASCMD & DSW.
Anda juga dapat menerapkan layanan model PyTorch melalui Konsol. Untuk informasi selengkapnya, lihat Penerapan layanan: Konsol.
Langkah 2: Panggil layanan
Layanan PyTorch menggunakan format Protocol Buffers (Protobuf) untuk input dan output, bukan teks biasa. Karena fitur debugging online hanya mendukung data teks biasa, Anda tidak dapat menggunakan fitur tersebut di Konsol.
EAS menyediakan kit pengembangan perangkat lunak (SDK) untuk berbagai bahasa pemrograman. SDK tersebut mengenkapsulasi data permintaan dan tanggapan serta mencakup mekanisme koneksi langsung dan toleransi kesalahan. Anda dapat menggunakan SDK untuk membuat dan mengirim permintaan. Kode berikut menampilkan contoh permintaan inferensi.
#!/usr/bin/env python
from eas_prediction import PredictClient
from eas_prediction import TorchRequest
if __name__ == '__main__':
client = PredictClient('http://182848887922****.cn-shanghai.pai-eas.aliyuncs.com', 'pytorch_gpu_wl')
client.init()
req = TorchRequest()
req.add_feed(0, [1, 3, 224, 224], TorchRequest.DT_FLOAT, [1] * 150528)
# req.add_fetch(0)
for x in range(0, 10):
resp = client.predict(req)
print(resp.get_tensor_shape(0))
Untuk informasi selengkapnya tentang pengaturan parameter dan metode pemanggilan dalam kode, lihat Gunakan Python SDK.
Anda juga dapat membuat permintaan layanan secara manual. Untuk informasi selengkapnya, lihat Format permintaan.
Format permintaan
PyTorch processor menggunakan format Protobuf untuk input dan output. Saat menggunakan SDK untuk mengirim permintaan, permintaan tersebut telah dienkapsulasi—Anda cukup menggunakan fungsi yang disediakan oleh SDK untuk membuatnya. Jika ingin membuat permintaan layanan secara manual, Anda dapat menghasilkan kode yang diperlukan dari definisi .proto berikut. Untuk informasi selengkapnya, lihat Buat permintaan untuk layanan TensorFlow.
syntax = "proto3";
package pytorch.eas;
option cc_enable_arenas = true;
enum ArrayDataType {
// Not a legal value for DataType. Used to indicate a DataType field
// has not been set
DT_INVALID = 0;
// Data types that all computation devices are expected to be
// capable to support
DT_FLOAT = 1;
DT_DOUBLE = 2;
DT_INT32 = 3;
DT_UINT8 = 4;
DT_INT16 = 5;
DT_INT8 = 6;
DT_STRING = 7;
DT_COMPLEX64 = 8; // Single-precision complex
DT_INT64 = 9;
DT_BOOL = 10;
DT_QINT8 = 11; // Quantized int8
DT_QUINT8 = 12; // Quantized uint8
DT_QINT32 = 13; // Quantized int32
DT_BFLOAT16 = 14; // Float32 truncated to 16 bits. Only for cast ops
DT_QINT16 = 15; // Quantized int16
DT_QUINT16 = 16; // Quantized uint16
DT_UINT16 = 17;
DT_COMPLEX128 = 18; // Double-precision complex
DT_HALF = 19;
DT_RESOURCE = 20;
DT_VARIANT = 21; // Arbitrary C++ data types
}
// Dimensions of an array
message ArrayShape {
repeated int64 dim = 1 [packed = true];
}
// Protocol buffer representing an array
message ArrayProto {
// Data Type
ArrayDataType dtype = 1;
// Shape of the array.
ArrayShape array_shape = 2;
// DT_FLOAT
repeated float float_val = 3 [packed = true];
// DT_DOUBLE
repeated double double_val = 4 [packed = true];
// DT_INT32, DT_INT16, DT_INT8, DT_UINT8.
repeated int32 int_val = 5 [packed = true];
// DT_STRING
repeated bytes string_val = 6;
// DT_INT64.
repeated int64 int64_val = 7 [packed = true];
}
message PredictRequest {
// Input tensors.
repeated ArrayProto inputs = 1;
// Output filter.
repeated int32 output_filter = 2;
}
// Response for PredictRequest on successful run.
message PredictResponse {
// Output tensors.
repeated ArrayProto outputs = 1;
}