Gunakan Kode Inferensi Anda Sendiri dengan Layanan Hosting - Amazon SageMaker

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

Gunakan Kode Inferensi Anda Sendiri dengan Layanan Hosting

Bagian ini menjelaskan bagaimana Amazon SageMaker berinteraksi dengan wadah Docker yang menjalankan kode inferensi Anda sendiri untuk layanan hosting. Gunakan informasi ini untuk menulis kode inferensi dan membuat gambar Docker.

Bagaimana SageMaker Menjalankan Gambar Inferensi Anda

Untuk mengonfigurasi wadah agar dijalankan sebagai executable, gunakan ENTRYPOINT instruksi dalam Dockerfile. Perhatikan hal berikut:

  • Untuk inferensi model, SageMaker jalankan wadah sebagai:

    docker run image serve

    SageMaker mengganti CMD pernyataan default dalam wadah dengan menentukan serve argumen setelah nama gambar. serveArgumen mengesampingkan argumen yang Anda berikan dengan CMD perintah di Dockerfile.

     

  • SageMaker mengharapkan semua kontainer berjalan dengan pengguna root. Buat wadah Anda sehingga hanya menggunakan pengguna root. Saat SageMaker menjalankan penampung Anda, pengguna yang tidak memiliki akses tingkat root dapat menyebabkan masalah izin.

     

  • Kami menyarankan Anda menggunakan exec bentuk ENTRYPOINT instruksi:

    ENTRYPOINT ["executable", "param1", "param2"]

    Sebagai contoh:

    ENTRYPOINT ["python", "k_means_inference.py"]

    execBentuk ENTRYPOINT instruksi memulai eksekusi secara langsung, bukan sebagai anak dari. /bin/sh Ini memungkinkannya menerima sinyal seperti SIGTERM dan SIGKILL dari operasi SageMaker API, yang merupakan persyaratan.

     

    Misalnya, saat Anda menggunakan CreateEndpointAPI untuk membuat titik akhir, SageMaker berikan jumlah instans komputasi ML yang diperlukan oleh konfigurasi titik akhir, yang Anda tentukan dalam permintaan. SageMaker menjalankan wadah Docker pada instance tersebut.

     

    Jika Anda mengurangi jumlah instance yang mendukung titik akhir (dengan memanggil UpdateEndpointWeightsAndCapacitiesAPI), SageMaker jalankan perintah untuk menghentikan wadah Docker pada instance yang sedang dihentikan. Perintah mengirimkan SIGTERM sinyal, kemudian mengirimkan SIGKILL sinyal tiga puluh detik kemudian.

     

    Jika Anda memperbarui titik akhir (dengan memanggil UpdateEndpointAPI), SageMaker luncurkan kumpulan instance komputasi HTML lainnya dan jalankan container Docker yang berisi kode inferensi Anda di dalamnya. Kemudian menjalankan perintah untuk menghentikan kontainer Docker sebelumnya. Untuk menghentikan kontainer Docker, perintah mengirimkan SIGTERM sinyal, lalu mengirimkan SIGKILL sinyal 30 detik kemudian.

     

  • SageMaker menggunakan definisi kontainer yang Anda berikan dalam CreateModelpermintaan Anda untuk mengatur variabel lingkungan dan nama host DNS untuk wadah sebagai berikut:

     

    • Ini menetapkan variabel lingkungan menggunakan ContainerDefinition.Environment string-to-string peta.

    • Ini menetapkan nama host DNS menggunakan file. ContainerDefinition.ContainerHostname

       

  • Jika Anda berencana menggunakan perangkat GPU untuk inferensi model (dengan menentukan instance komputasi ML berbasis GPU dalam CreateEndpointConfig permintaan Anda), pastikan container Anda kompatibel. nvidia-docker Jangan bundel driver NVIDIA dengan gambar. Untuk informasi selengkapnyanvidia-docker, lihat NVIDIA/NVIDIA-Docker.

     

  • Anda tidak dapat menggunakan tini penginisialisasi sebagai titik masuk Anda dalam SageMaker wadah karena menjadi bingung oleh argumen train danserve.

Bagaimana SageMaker Memuat Artefak Model Anda

Dalam permintaan CreateModelAPI Anda, Anda dapat menggunakan S3DataSource parameter ModelDataUrl atau untuk mengidentifikasi lokasi S3 tempat artefak model disimpan. SageMaker menyalin artefak model Anda dari lokasi S3 ke /opt/ml/model direktori untuk digunakan oleh kode inferensi Anda. Kontainer Anda memiliki akses hanya-baca ke. /opt/ml/model Jangan menulis ke direktori ini.

ModelDataUrlHarus menunjuk ke file tar.gz. Jika SageMaker tidak, tidak akan mengunduh file.

Jika Anda melatih model Anda SageMaker, artefak model disimpan sebagai file tar terkompresi tunggal di Amazon S3. Jika Anda melatih model Anda di luar SageMaker, Anda perlu membuat file tar terkompresi tunggal ini dan menyimpannya di lokasi S3. SageMaker mendekompresi file tar ini ke direktori /opt/ml/model sebelum penampung Anda dimulai.

Untuk menerapkan model besar, kami sarankan Anda mengikutiMenyebarkan model yang tidak terkompresi.

Bagaimana Kontainer Anda Harus Menanggapi Permintaan Inferensi

Untuk mendapatkan kesimpulan, aplikasi klien mengirimkan permintaan POST ke titik SageMaker akhir. SageMaker meneruskan permintaan ke wadah, dan mengembalikan hasil inferensi dari wadah ke klien.

Untuk informasi selengkapnya tentang permintaan inferensi yang akan diterima container Anda, lihat tindakan berikut di Referensi Amazon SageMaker API:

Persyaratan untuk wadah inferensi

Untuk menanggapi permintaan inferensi, kontainer Anda harus memenuhi persyaratan berikut:

  • SageMaker menghapus semua POST header kecuali yang didukung olehInvokeEndpoint. SageMaker mungkin menambahkan header tambahan. Wadah inferensi harus dapat dengan aman mengabaikan header tambahan ini.

  • Untuk menerima permintaan inferensi, penampung harus memiliki server web yang mendengarkan pada port 8080 dan harus menerima POST permintaan ke /invocations dan /ping titik akhir.

  • Kontainer model pelanggan harus menerima permintaan koneksi soket dalam 250 ms.

  • Kontainer model pelanggan harus menanggapi permintaan dalam waktu 60 detik. Model itu sendiri dapat memiliki waktu pemrosesan maksimum 60 detik sebelum merespons. /invocations Jika model Anda akan memakan waktu 50-60 detik waktu pemrosesan, batas waktu soket SDK harus disetel menjadi 70 detik.

contoh fungsi pemanggilan

Contoh berikut menunjukkan bagaimana kode dalam wadah Anda dapat memproses permintaan inferensi. Contoh-contoh ini menangani permintaan yang dikirim aplikasi klien dengan menggunakan InvokeEndpoint tindakan.

FastAPI

FastTapi adalah kerangka kerja web untuk membangun API dengan Python.

from fastapi import FastAPI, status, Request, Response . . . app = FastAPI() . . . @app.post('/invocations') async def invocations(request: Request): # model() is a hypothetical function that gets the inference output: model_resp = await model(Request) response = Response( content=model_resp, status_code=status.HTTP_200_OK, media_type="text/plain", ) return response . . .

Dalam contoh ini, invocations fungsi menangani permintaan inferensi yang SageMaker mengirim ke titik /invocations akhir.

Flask

Flask adalah kerangka kerja untuk mengembangkan aplikasi web dengan Python.

import flask . . . app = flask.Flask(__name__) . . . @app.route('/invocations', methods=["POST"]) def invoke(request): # model() is a hypothetical function that gets the inference output: resp_body = model(request) return flask.Response(resp_body, mimetype='text/plain')

Dalam contoh ini, invoke fungsi menangani permintaan inferensi yang SageMaker mengirim ke titik /invocations akhir.

contoh fungsi pemanggilan untuk permintaan streaming

Contoh berikut menunjukkan bagaimana kode dalam wadah inferensi Anda dapat memproses permintaan inferensi streaming. Contoh-contoh ini menangani permintaan yang dikirim aplikasi klien dengan menggunakan InvokeEndpointWithResponseStream tindakan.

Ketika sebuah wadah menangani permintaan inferensi streaming, ia mengembalikan inferensi model sebagai serangkaian bagian secara bertahap saat model menghasilkannya. Aplikasi klien mulai menerima tanggapan segera ketika tersedia. Mereka tidak perlu menunggu model untuk menghasilkan seluruh respons. Anda dapat menerapkan streaming untuk mendukung pengalaman interaktif yang cepat, seperti chatbots, asisten virtual, dan generator musik.

FastAPI

FastTapi adalah kerangka kerja web untuk membangun API dengan Python.

from starlette.responses import StreamingResponse from fastapi import FastAPI, status, Request . . . app = FastAPI() . . . @app.post('/invocations') async def invocations(request: Request): # Streams inference response using HTTP chunked encoding async def generate(): # model() is a hypothetical function that gets the inference output: yield await model(Request) yield "\n" response = StreamingResponse( content=generate(), status_code=status.HTTP_200_OK, media_type="text/plain", ) return response . . .

Dalam contoh ini, invocations fungsi menangani permintaan inferensi yang SageMaker mengirim ke titik /invocations akhir. Untuk mengalirkan respons, contoh menggunakan StreamingResponse kelas dari kerangka Starlette.

Flask

Flask adalah kerangka kerja untuk mengembangkan aplikasi web dengan Python.

import flask . . . app = flask.Flask(__name__) . . . @app.route('/invocations', methods=["POST"]) def invocations(request): # Streams inference response using HTTP chunked encoding def generate(): # model() is a hypothetical function that gets the inference output: yield model(request) yield "\n" return flask.Response( flask.stream_with_context(generate()), mimetype='text/plain') . . .

Dalam contoh ini, invocations fungsi menangani permintaan inferensi yang SageMaker mengirim ke titik /invocations akhir. Untuk mengalirkan respons, contoh menggunakan flask.stream_with_context fungsi dari kerangka Flask.

Bagaimana Kontainer Anda Harus Menanggapi Permintaan Pemeriksaan Kesehatan (Ping)

SageMaker meluncurkan wadah inferensi baru dalam situasi berikut:

  • MenanggapiCreateEndpoint,UpdateEndpoint, dan panggilan UpdateEndpointWeightsAndCapacities API

  • Membuat patch keamanan

  • Mengganti instance yang tidak sehat

Segera setelah startup container, SageMaker mulai mengirim permintaan GET berkala ke /ping titik akhir.

Persyaratan paling sederhana pada wadah adalah merespons dengan kode status HTTP 200 dan badan kosong. Ini menunjukkan SageMaker bahwa penampung siap menerima permintaan inferensi di titik /invocations akhir.

Jika wadah tidak mulai lulus pemeriksaan kesehatan dengan merespons secara konsisten dengan 200s selama 8 menit setelah startup, peluncuran instance baru gagal. Hal ini CreateEndpoint menyebabkan kegagalan, meninggalkan titik akhir dalam keadaan gagal. Pembaruan yang diminta oleh UpdateEndpoint tidak selesai, patch keamanan tidak diterapkan, dan instance yang tidak sehat tidak diganti.

Sementara bilah minimum adalah wadah mengembalikan 200 statis, pengembang kontainer dapat menggunakan fungsi ini untuk melakukan pemeriksaan lebih dalam. Batas waktu permintaan pada /ping upaya adalah 2 detik.