Cara mengemas model terdaftar dengan Docker

Pelajari cara mengemas model Azure Machine Learning terdaftar dengan Docker.

Prasyarat

Artikel ini mengasumsikan Anda telah melatih dan mendaftarkan model di ruang kerja pembelajaran mesin Anda. Untuk mempelajari cara melatih dan mendaftarkan model scikit-learn, ikuti tutorial ini.

Model paket

Dalam beberapa kasus, Anda mungkin ingin membuat gambar Docker tanpa menyebarkan model (jika, misalnya, Anda berencana untuk menyebarkan ke Azure App Service). Atau Anda mungkin ingin mengunduh gambar dan menjalankannya pada penginstalan Docker lokal. Anda bahkan mungkin ingin mengunduh file yang digunakan untuk membangun gambar, memeriksanya, memodifikasinya, dan membangun gambar secara manual.

Pengemasan model memungkinkan Anda untuk melakukan hal-hal ini. Tindakan ini mengemas semua aset yang diperlukan untuk menghosting model sebagai layanan web dan memungkinkan Anda untuk mengunduh gambar Docker yang sepenuhnya dibangun atau file yang diperlukan untuk membangunnya. Ada dua cara untuk menggunakan pengemasan model:

Unduh model yang dikemas: Unduh gambar Docker yang berisi model dan file lain yang diperlukan untuk menghostingnya sebagai layanan web.

Buat Dockerfile: Unduh Dockerfile, model, skrip entri, dan aset lain yang diperlukan untuk membangun gambar Docker. Anda kemudian dapat memeriksa file atau membuat perubahan sebelum membangun gambar secara lokal.

Kedua pengemasan dapat digunakan untuk mendapatkan gambar Docker lokal.

Tip

Membuat kemasan mirip dengan menyebarkan model. Anda menggunakan model terdaftar dan konfigurasi inferensi.

Penting

Untuk mengunduh gambar yang dibangun sepenuhnya atau membangun gambar secara lokal, Anda harus memasang Docker di lingkungan pengembangan Anda.

Mengunduh model yang dikemas

Contoh berikut membangun gambar yang terdaftar di registri kontainer Azure untuk ruang kerja Anda:

package = Model.package(ws, [model], inference_config)
package.wait_for_creation(show_output=True)

Setelah membuat kemasan, Anda dapat menggunakan package.pull() untuk menarik gambar ke lingkungan Docker lokal Anda. Output dari perintah ini akan menampilkan nama gambar. Contohnya:

Status: Downloaded newer image for myworkspacef78fd10.azurecr.io/package:20190822181338.

Setelah mengunduh model, gunakan perintah docker images untuk mencantumkan gambar lokal:

REPOSITORY                               TAG                 IMAGE ID            CREATED             SIZE
myworkspacef78fd10.azurecr.io/package    20190822181338      7ff48015d5bd        4 minutes ago       1.43 GB

Untuk memulai kontainer lokal berdasarkan gambar ini, gunakan perintah berikut untuk memulai kontainer bernama dari shell atau baris perintah. Ganti nilai <imageid> dengan ID gambar yang ditampilkan oleh perintah docker images.

docker run -p 6789:5001 --name mycontainer <imageid>

Perintah ini memulai versi terbaru dari gambar bernama myimage. Perintah tersebut memetakan port lokal 6789 ke port dalam kontainer tempat layanan web mendengarkan (5001). Ia juga menetapkan nama mycontainer ke kontainer, yang membuat kontainer lebih mudah dihentikan. Setelah kontainer dimulai, Anda dapat mengirimkan permintaan ke http://localhost:6789/score.

Membuat Dockerfile dan dependensi

Contoh berikut menunjukkan cara mengunduh Dockerfile, model, dan aset lain yang diperlukan untuk membangun gambar secara lokal. Parameter generate_dockerfile=True menunjukkan bahwa Anda menginginkan file, bukan gambar yang dibuat sepenuhnya.

package = Model.package(ws, [model], inference_config, generate_dockerfile=True)
package.wait_for_creation(show_output=True)
# Download the package.
package.save("./imagefiles")
# Get the Azure container registry that the model/Dockerfile uses.
acr=package.get_container_registry()
print("Address:", acr.address)
print("Username:", acr.username)
print("Password:", acr.password)

Kode ini mengunduh file yang diperlukan untuk membangun gambar ke direktori imagefiles. Dockerfile yang disertakan dalam file yang disimpan mereferensikan gambar dasar yang disimpan dalam registri kontainer Azure. Saat Anda membangun gambar di penginstalan Docker lokal, Anda perlu menggunakan alamat, nama pengguna, dan kata sandi untuk mengautentikasi ke registri. Gunakan langkah-langkah berikut untuk membangun gambar dengan menggunakan penginstalan Docker lokal:

  1. Dari sesi shell atau baris perintah, gunakan perintah berikut ini untuk mengautentikasi Docker dengan registri kontainer Azure. Ganti <address>, <username>, dan <password> dengan nilai yang diambil oleh package.get_container_registry().

    docker login <address> -u <username> -p <password>
    
  2. Untuk membangun gambar, gunakan perintah berikut. Ganti <imagefiles> dengan jalur direktori tempat package.save() menyimpan file.

    docker build --tag myimage <imagefiles>
    

    Perintah ini mengatur nama gambar menjadi myimage.

Untuk memverifikasi bahwa gambar dibangun, gunakan perintah docker images. Anda akan melihat gambar myimage dalam daftar:

REPOSITORY      TAG                 IMAGE ID            CREATED             SIZE
<none>          <none>              2d5ee0bf3b3b        49 seconds ago      1.43 GB
myimage         latest              739f22498d64        3 minutes ago       1.43 GB

Untuk memulai kontainer baru berdasarkan gambar ini, gunakan perintah berikut:

docker run -p 6789:5001 --name mycontainer myimage:latest

Perintah ini memulai versi terbaru dari gambar bernama myimage. Perintah tersebut memetakan port lokal 6789 ke port dalam kontainer tempat layanan web mendengarkan (5001). Ia juga menetapkan nama mycontainer ke kontainer, yang membuat kontainer lebih mudah dihentikan. Setelah kontainer dimulai, Anda dapat mengirimkan permintaan ke http://localhost:6789/score.

Contoh klien untuk menguji kontainer lokal

Kode berikut adalah contoh klien Python yang dapat digunakan dengan kontainer:

import requests
import json

# URL for the web service.
scoring_uri = 'http://localhost:6789/score'

# Two sets of data to score, so we get two results back.
data = {"data":
        [
            [ 1,2,3,4,5,6,7,8,9,10 ],
            [ 10,9,8,7,6,5,4,3,2,1 ]
        ]
        }
# Convert to JSON string.
input_data = json.dumps(data)

# Set the content type.
headers = {'Content-Type': 'application/json'}

# Make the request and display the response.
resp = requests.post(scoring_uri, input_data, headers=headers)
print(resp.text)

Untuk mengetahui contoh klien dalam bahasa pemrogram lain, lihat Menggunakan model yang disebarkan sebagai layanan web.

Menghentikan kontainer Docker

Untuk menghentikan kontainer, gunakan perintah berikut dari shell atau baris perintah yang berbeda:

docker kill mycontainer

Langkah berikutnya