Topik ini menyediakan referensi API lengkap untuk Python SDK resmi dan mencakup contoh kode lengkap untuk format input dan output umum.
Untuk mempelajari kasus penggunaan dan prinsip kerja SDK, lihat SDK untuk panggilan layanan.
Prasyarat
pip install -U eas-prediction --userMulai cepat
Pilih kelas Request yang sesuai dengan format data input model Anda. Kode berikut menunjukkan contoh minimal panggilan layanan end-to-end menggunakan permintaan string. Untuk contoh lainnya, lihat Contoh.
#!/usr/bin/env python
from eas_prediction import PredictClient
from eas_prediction import StringRequest
if __name__ == '__main__':
client = PredictClient('http://182848887922****.cn-shanghai.pai-eas.aliyuncs.com', 'my_service')
client.set_token('YOUR_SERVICE_TOKEN')
client.init()
request = StringRequest('[{}]')
resp = client.predict(request)
print(resp)Referensi API
Python SDK menyediakan kelas-kelas berikut, dikelompokkan berdasarkan tujuan:
Grup | Deskripsi |
Klien utama |
|
Input dan output |
|
Layanan antrian |
|
Parameter umum
Endpoint: Alamat endpoint server.
Untuk layanan standar, atur parameter ini ke endpoint gateway default. Contoh:
182848887922***.cn-shanghai.pai-eas.aliyuncs.com.Untuk permintaan koneksi langsung VPC, atur parameter ini ke endpoint koneksi langsung VPC layanan. Formatnya adalah
<uid>.vpc.<region-id>.pai-eas.aliyuncs.com. Contoh:182848887922****.vpc.cn-shanghai.pai-eas.aliyuncs.com.
Kelas PredictClient
Metode | Deskripsi |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| Menginisialisasi objek PredictClient. Setelah Anda mengatur parameter, Anda perlu memanggil metode |
|
|
Kelas StringRequest
Metode | Deskripsi |
|
|
Kelas StringResponse
Metode | Deskripsi |
|
|
Kelas TFRequest
Metode | Deskripsi |
|
|
|
|
|
|
|
|
Kelas TFResponse
Metode | Deskripsi |
|
|
|
|
Kelas TorchRequest
Metode | Deskripsi |
| Membuat objek |
|
|
|
|
|
|
Kelas TorchResponse
Metode | Deskripsi |
|
|
|
|
Kelas QueueClient
Metode | Deskripsi |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Kelas Watcher
Metode | Deskripsi |
|
|
| Deskripsi: Menutup objek Watcher untuk menghentikan koneksi data back-end. Catatan Klien hanya dapat memiliki satu Watcher aktif sekaligus. Anda harus menutup Watcher saat ini sebelum memulai yang baru. |
Contoh
Contoh inferensi sinkron (berdasarkan format input/output)
Pilih kode contoh berdasarkan tipe input dan output layanan.
String
Pengguna yang menerapkan layanan dengan prosesor kustom biasanya menggunakan string untuk panggilan layanan, seperti pada layanan model PMML. Kode berikut menunjukkan program contoh.
#!/usr/bin/env python
from eas_prediction import PredictClient
from eas_prediction import StringRequest
if __name__ == '__main__':
client = PredictClient('http://182848887922****.cn-shanghai.pai-eas.aliyuncs.com', 'scorecard_pmml_example')
client.set_token('YWFlMDYyZDNmNTc3M2I3MzMwYmY0MmYwM2Y2MTYxMTY4NzBkNzdj****')
client.init()
request = StringRequest('[{"fea1": 1, "fea2": 2}]')
for x in range(0, 1000000):
resp = client.predict(request)
print(resp)TensorFlow
Jika Anda menggunakan TensorFlow, gunakan TFRequest dan TFResponse sebagai format data input dan output. Kode berikut menunjukkan contohnya.
#!/usr/bin/env python
from eas_prediction import PredictClient
from eas_prediction import StringRequest
from eas_prediction import TFRequest
if __name__ == '__main__':
client = PredictClient('http://182848887922****.cn-shanghai.pai-eas.aliyuncs.com', 'mnist_saved_model_example')
client.set_token('YTg2ZjE0ZjM4ZmE3OTc0NzYxZDMyNmYzMTJjZTQ1YmU0N2FjMTAy****')
client.init()
#request = StringRequest('[{}]')
req = TFRequest('predict_images')
req.add_feed('images', [1, 784], TFRequest.DT_FLOAT, [1] * 784)
for x in range(0, 1000000):
resp = client.predict(req)
print(resp)PyTorch
Jika Anda menggunakan PyTorch, gunakan TorchRequest dan TorchResponse sebagai format data input dan output. Kode berikut menunjukkan contohnya.
#!/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)
import time
st = time.time()
timer = 0
for x in range(0, 10):
resp = client.predict(req)
timer += (time.time() - st)
st = time.time()
print(resp.get_tensor_shape(0))
# print(resp)
print("average response time: %s s" % (timer / 10) )BladeProcessor
Jika Anda menggunakan BladeProcessor, gunakan BladeRequest dan BladeResponse sebagai format data input dan output. Kode berikut menunjukkan contohnya.
#!/usr/bin/env python
from eas_prediction import PredictClient
from eas_prediction import BladeRequest
if __name__ == '__main__':
client = PredictClient('http://182848887922****.cn-shanghai.pai-eas.aliyuncs.com', 'nlp_model_example')
client.init()
req = BladeRequest()
req.add_feed('input_data', 1, [1, 360, 128], BladeRequest.DT_FLOAT, [0.8] * 85680)
req.add_feed('input_length', 1, [1], BladeRequest.DT_INT32, [187])
req.add_feed('start_token', 1, [1], BladeRequest.DT_INT32, [104])
req.add_fetch('output', BladeRequest.DT_FLOAT)
import time
st = time.time()
timer = 0
for x in range(0, 10):
resp = client.predict(req)
timer += (time.time() - st)
st = time.time()
# print(resp)
# print(resp.get_values('output'))
print(resp.get_tensor_shape('output'))
print("average response time: %s s" % (timer / 10) )BladeProcessor kompatibel dengan antarmuka TensorFlow default
Pengguna BladeProcessor dapat menggunakan TFRequest dan TFResponse sebagai format data input dan output. Format ini kompatibel dengan antarmuka TensorFlow default Elastic Algorithm Service (EAS). Kode berikut menunjukkan contohnya.
#!/usr/bin/env python
from eas_prediction import PredictClient
from eas_prediction.blade_tf_request import TFRequest # Perlu mengimpor blade TFRequest
if __name__ == '__main__':
client = PredictClient('http://182848887922****.cn-shanghai.pai-eas.aliyuncs.com', 'nlp_model_example')
client.init()
req = TFRequest(signature_name='predict_words')
req.add_feed('input_data', [1, 360, 128], TFRequest.DT_FLOAT, [0.8] * 85680)
req.add_feed('input_length', [1], TFRequest.DT_INT32, [187])
req.add_feed('start_token', [1], TFRequest.DT_INT32, [104])
req.add_fetch('output')
import time
st = time.time()
timer = 0
for x in range(0, 10):
resp = client.predict(req)
timer += (time.time() - st)
st = time.time()
# print(resp)
# print(resp.get_values('output'))
print(resp.get_tensor_shape('output'))
print("average response time: %s s" % (timer / 10) )Contoh memanggil layanan menggunakan koneksi langsung VPC
Untuk menggunakan koneksi langsung, konfigurasikan Virtual Private Cloud (VPC) untuk layanan tersebut. Untuk informasi lebih lanjut, lihat Gunakan kelompok sumber daya Elastic Algorithm Service (EAS) dan Akses sumber daya publik atau internal dari EAS. Metode pemanggilan ini hanya memerlukan satu baris kode tambahan dibandingkan metode normal: client.set_endpoint_type(ENDPOINT_TYPE_DIRECT). Metode ini ideal untuk layanan dengan trafik dan konkurensi tinggi. Kode berikut memberikan contohnya.
#!/usr/bin/env python
from eas_prediction import PredictClient
from eas_prediction import StringRequest
from eas_prediction import TFRequest
from eas_prediction import ENDPOINT_TYPE_DIRECT
if __name__ == '__main__':
# Format endpoint koneksi langsung VPC adalah <uid>.vpc.<region-id>.pai-eas.aliyuncs.com. Anda dapat menemukan endpoint di tab Informasi Pemanggilan pada halaman detail layanan di Konsol EAS.
client = PredictClient('http://182848887922****.vpc.cn-hangzhou.pai-eas.aliyuncs.com', 'mnist_saved_model_example')
client.set_token('M2FhNjJlZDBmMzBmMzE4NjFiNzZhMmUxY2IxZjkyMDczNzAzYjFi****')
client.set_endpoint_type(ENDPOINT_TYPE_DIRECT)
client.init()
request = TFRequest('predict_images')
request.add_feed('images', [1, 784], TFRequest.DT_FLOAT, [1] * 784)
for x in range(0, 1000000):
resp = client.predict(request)
print(resp)Contoh: Mengirim dan berlangganan data dalam layanan antrian
Anda dapat menggunakan QueueClient untuk mengirim data ke layanan antrian, mengkueri data, memeriksa status layanan, dan berlangganan dorongan data. Demo berikut menunjukkan contoh dengan dua thread. Satu thread mengirim data ke layanan antrian. Thread lainnya menggunakan Watcher untuk berlangganan data yang didorong.
#!/usr/bin/env python
from eas_prediction import QueueClient
import threading
if __name__ == '__main__':
endpoint = '182848887922****.cn-shanghai.pai-eas.aliyuncs.com'
queue_name = 'test_group.qservice/sink'
token = 'YmE3NDkyMzdiMzNmMGM3ZmE4ZmNjZDk0M2NiMDA3OTZmNzc1MTUx****'
queue = QueueClient(endpoint, queue_name)
queue.set_token(token)
queue.init()
queue.set_timeout(30000)
# hapus semua pesan dalam antrian
attributes = queue.attributes()
if 'stream.lastEntry' in attributes:
queue.truncate(int(attributes['stream.lastEntry']) + 1)
count = 100
# buat thread untuk mengirim pesan ke antrian
def send_thread():
for i in range(count):
index, request_id = queue.put('[{}]')
print('send: ', i, index, request_id)
# buat thread untuk menonton pesan dari antrian
def watch_thread():
watcher = queue.watch(0, 5, auto_commit=True)
i = 0
for x in watcher.run():
print('recv: ', i, x.index, x.tags['requestId'])
i += 1
if i == count:
break
watcher.close()
thread1 = threading.Thread(target=watch_thread)
thread2 = threading.Thread(target=send_thread)
thread1.start()
thread2.start()
thread1.join()
thread2.join()Penanganan pengecualian dan pengambilan ID permintaan
Saat panggilan PredictClient.predict() gagal, akan muncul PredictException. Pengecualian ini hanya memiliki dua atribut: code (kode status HTTP) dan message (pesan kesalahan). Pengecualian ini tidak memiliki atribut request_id terpisah.
Cara Anda memperoleh ID permintaan bergantung pada apakah permintaan mencapai server:
Permintaan mencapai server: Badan respons XML yang dikembalikan oleh server disematkan dalam atribut
messagepengecualian. Elemen<RequestId>dalam badan tersebut adalah ID permintaan untuk panggilan tersebut, dan Anda harus mengekstraknya dengan ekspresi reguler atau parser XML. Misalnya, jika Anda memanggil endpoint yang valid dengan nama layanan yang tidak ada, server mengembalikan HTTP 404 dan ID permintaan seperti019FEB40-3720-5073-B3E5-4532B42EFDE9dapat diurai darimessage.Permintaan tidak mencapai server: Jika panggilan gagal di lapisan jaringan (misalnya, kegagalan resolusi DNS atau kegagalan handshake SSL),
messagetidak berisi ID permintaan. Misalnya, memanggil endpoint yang tidak dapat diselesaikan menimbulkan pengecualian yangcode-nya adalah 500 danmessage-nya berisi informasi sepertiMax retries exceededdanFailed to resolve. Dalam kasus ini, periksa konfigurasi jaringan dan sertifikat di klien alih-alih menyelidiki server.
Contoh berikut menunjukkan cara menangkap pengecualian, membaca code, dan mengurai ID permintaan dari message:
from eas_prediction import PredictClient, StringRequest, PredictException
import re
client = PredictClient('http://pai-eas.cn-shanghai.aliyuncs.com', 'your_service')
client.set_token('your_token')
client.init()
req = StringRequest('{"input": "test"}')
try:
resp = client.predict(req)
print(resp.to_string())
except PredictException as e:
print('Error code:', e.code)
msg = e.message.decode('utf-8') if isinstance(e.message, bytes) else str(e.message)
match = re.search(r'<RequestId>(.*?)</RequestId>', msg)
if match:
print('Request ID:', match.group(1))
else:
print('No request ID: the request may not have reached the server')Jika pesan kesalahan menunjukkan kegagalan terkait SSL, lakukan troubleshooting sebagai berikut:
Tingkatkan sertifikat CA: jalankan
pip install --upgrade certifi.Periksa bahwa pengaturan proxy lokal benar dan proxy tidak mencegat atau menulis ulang permintaan HTTPS.
Konfirmasi bahwa endpoint layanan EAS yang Anda gunakan mendukung akses HTTPS, dan periksa bahwa awalan protokol endpoint sesuai dengan gateway aktual.
Troubleshooting
Untuk informasi tentang gejala, penyebab, dan troubleshooting pengecualian dari panggilan Python SDK, lihat bagian 'Troubleshooting call exceptions' dalam Service Call SDK. Pengecualian ini mencakup masalah umum terkait otentikasi, routing, koneksi, dan server.
Untuk daftar lengkap kode status layanan, deskripsi pesan kesalahan, dan solusi yang disarankan, lihat Lampiran: Kode status layanan dan kesalahan umum.