Topik ini menjelaskan cara menggunakan Serverless Devs untuk mengaktifkan fungsi GPU berdasarkan tugas asinkron dan meneruskan hasil pengaktifan ke fungsi tujuan asinkron yang telah dikonfigurasi.
Informasi latar belakang
GPU-accelerated Instances
Dengan penerapan pembelajaran mesin yang meluas, terutama pembelajaran mendalam, CPU tidak lagi memenuhi persyaratan daya komputasi yang dihasilkan oleh sejumlah besar operasi vektor, matriks, dan tensor. Persyaratan ini mencakup kebutuhan perhitungan presisi tinggi dalam skenario pelatihan serta perhitungan presisi rendah dalam skenario inferensi. Pada tahun 2007, Nvidia meluncurkan kerangka Compute Unified Device Architecture (CUDA), sebuah platform komputasi umum yang dapat diprogram. Para peneliti dan pengembang merevisi banyak algoritma untuk meningkatkan kinerja hingga puluhan atau bahkan ribuan kali lipat. Sejak itu, GPU menjadi salah satu infrastruktur dasar dari berbagai alat, algoritma, dan kerangka kerja dalam pembelajaran mesin.
Selama Apsara Conference 2021, Alibaba Cloud Function Compute secara resmi meluncurkan instans yang dipercepat GPU dengan arsitektur Turing. Pengembang serverless dapat menggunakan perangkat keras GPU untuk mempercepat tugas pelatihan AI dan inferensi, sehingga meningkatkan efisiensi pelatihan model dan layanan inferensi.
Asynchronous tasks
Function Compute menyediakan kemampuan lengkap untuk mendistribusikan, mengeksekusi, dan memantau tugas asinkron. Ini memungkinkan Anda fokus pada penyusunan logika pemrosesan tugas, cukup dengan membuat dan mengirimkan fungsi pemrosesan tugas. Function Compute juga menyediakan fitur pemantauan seperti log tugas asinkron, metrik, statistik durasi di setiap fase, penskalaan otomatis instans, deduplikasi tugas, penghentian tugas tertentu, serta penangguhan, pemulihan, dan penghapusan tugas massal. Untuk informasi lebih lanjut, lihat Ikhtisar.
Skenario
Dalam skenario inferensi AI non-real-time dan offline, pelatihan AI, serta produksi audio dan video, fungsi GPU diaktifkan melalui tugas asinkron. Hal ini memungkinkan pengembang untuk fokus pada bisnis dan secara cepat mencapai tujuan bisnis. Berikut ini adalah metode implementasinya:
Sumber daya GPU dapat digunakan dalam mode 1/8, 1/4, 1/2, atau eksklusif dengan memanfaatkan teknologi virtualisasi GPU. Dengan cara ini, instans yang dipercepat GPU dapat dikonfigurasi secara lebih presisi.
Berbagai kemampuan pemrosesan tugas asinkron yang telah matang disediakan, seperti manajemen mode asinkron, deduplikasi tugas, pemantauan tugas, percobaan ulang tugas, pemicuan acara, panggilan balik hasil, dan orkestrasi tugas.
Pengembang dapat fokus pada pengembangan kode dan pencapaian tujuan bisnis tanpa perlu melakukan operasi dan pemeliharaan (O&M) pada kluster GPU, seperti manajemen versi driver dan CUDA, operasi mesin, serta manajemen kartu GPU yang bermasalah.
Cara Kerja
Topik ini menjelaskan cara menerapkan fungsi GPU dan mengimplementasikan panggilan balik hasil. Dalam topik ini, fungsi GPU tgpu_basic_func diterapkan, fungsi async-callback-succ-func ditentukan sebagai fungsi panggilan balik untuk pengaktifan yang berhasil, dan fungsi async-callback-fail-func dikonfigurasi sebagai fungsi panggilan balik untuk pengaktifan yang gagal. Tabel berikut mencantumkan informasi tentang fungsi-fungsi tersebut.
Fungsi | Deskripsi | Lingkungan runtime | Tipe instans | Tipe pemicu |
tgpu_basic_func | Fungsi yang menjalankan tugas AI semi-real-time dan tugas AI offline berdasarkan instans yang dipercepat GPU dari Function Compute | Custom Container | Instans yang dipercepat GPU | Fungsi HTTP |
async-callback-succ-func | Fungsi panggilan balik tujuan untuk eksekusi tugas yang berhasil | Python 3 | Instans elastis | Fungsi acara |
async-callback-fail-func | Fungsi panggilan balik tujuan untuk eksekusi tugas yang gagal | Python 3 | Instans elastis | Fungsi acara |
Gambar berikut mengilustrasikan alur kerja.
Sebelum Anda Mulai
Langkah 1: Terapkan fungsi panggilan balik untuk pengaktifan yang berhasil
Inisialisasi proyek.
s init devsapp/start-fc-event-python3 -d async-succ-callbackKode contoh berikut menunjukkan struktur direktori proyek yang dibuat:
├── async-succ-callback │ ├── code │ │ └── index.py │ └── s.yamlBuka direktori tempat proyek berada.
cd async-succ-callbackUbah parameter konfigurasi dalam file direktori sesuai dengan kebutuhan bisnis Anda.
Edit file
s.yamldengan contoh berikut:edition: 1.0.0 name: hello-world-app # access menentukan informasi kunci yang diperlukan oleh aplikasi saat ini. # Untuk informasi tentang cara mengonfigurasi kunci, kunjungi https://www.serverless-devs.com/serverless-devs/command/config. # Untuk informasi lebih lanjut tentang cara menggunakan kunci, kunjungi https://www.serverless-devs.com/serverless-devs/tool. access: "default" vars: # Variabel global region: "cn-shenzhen" services: helloworld: # Nama layanan atau modul. component: fc props: region: ${vars.region} service: name: "async-callback-service" description: 'layanan panggilan balik asinkron' # Dapatkan dokumen konfigurasi logConfig dari https://gitee.com/devsapp/fc/blob/main/docs/zh/yaml/service.md#logconfig. logConfig: project: tgpu-prj-sh # Proyek yang menyimpan log permintaan. Anda harus membuat proyek di Layanan Log Sederhana terlebih dahulu. Kami sarankan Anda mengonfigurasi item ini. logstore: tgpu-logstore-sh # Penyimpanan log yang menyimpan log permintaan. Anda harus membuat Penyimpanan log di Layanan Log Sederhana terlebih dahulu. Kami sarankan Anda mengonfigurasi item ini. enableRequestMetrics: true enableInstanceMetrics: true logBeginRule: DefaultRegex function: name: "async-callback-succ-func" description: 'fungsi panggilan balik sukses asinkron' runtime: python3 codeUri: ./code handler: index.handler memorySize: 128 timeout: 60Edit file
index.py. Contoh berikut menunjukkan caranya:# -*- coding: utf-8 -*- import logging # Untuk mengaktifkan fitur inisialisasi # harap implementasikan fungsi inisialisasi sebagai berikut: # def initializer(context): # logger = logging.getLogger() # logger.info('initializing') def handler(event, context): logger = logging.getLogger() logger.info('hello async callback succ') return 'hello async callback succ'
Terapkan kode ke Function Compute.
s deployAnda dapat melihat fungsi yang diterapkan di Function Compute console.
Aktifkan dan debug fungsi menggunakan mesin lokal.
s invokeSetelah aktivasi selesai,
hello async callback succakan dikembalikan.
Langkah 2: Terapkan fungsi panggilan balik untuk pengaktifan yang gagal
Inisialisasi proyek.
s init devsapp/start-fc-event-python3 -d async-fail-callbackKode contoh berikut menunjukkan struktur direktori proyek yang dibuat:
├── async-fail-callback │ ├── code │ │ └── index.py │ └── s.yamlBuka direktori tempat proyek berada.
cd async-fail-callbackSesuaikan konfigurasi parameter dalam file direktori berdasarkan kebutuhan bisnis Anda.
Edit file
s.yaml. Berikut adalah contohnya:edition: 1.0.0 name: hello-world-app # access menentukan informasi kunci yang diperlukan oleh aplikasi saat ini. # Untuk informasi tentang cara mengonfigurasi kunci, kunjungi https://www.serverless-devs.com/serverless-devs/command/config. # Untuk informasi lebih lanjut tentang cara menggunakan kunci, kunjungi https://www.serverless-devs.com/serverless-devs/tool. access: "default" vars: # Variabel global region: "cn-shenzhen" services: helloworld: # Nama layanan atau modul. component: fc props: region: ${vars.region} service: name: "async-callback-service" description: 'layanan panggilan balik asinkron' # Dapatkan dokumen konfigurasi logConfig dari https://gitee.com/devsapp/fc/blob/main/docs/zh/yaml/service.md#logconfig. logConfig: project: tgpu-prj-sh # Proyek yang menyimpan log permintaan. Anda harus membuat proyek di Layanan Log Sederhana terlebih dahulu. Kami sarankan Anda mengonfigurasi item ini. logstore: tgpu-logstore-sh # Penyimpanan log yang menyimpan log permintaan. Anda harus membuat Penyimpanan log di Layanan Log Sederhana terlebih dahulu. Kami sarankan Anda mengonfigurasi item ini. enableRequestMetrics: true enableInstanceMetrics: true logBeginRule: DefaultRegex function: name: "async-callback-fail-func" description: 'fungsi panggilan balik gagal asinkron' runtime: python3 codeUri: ./code handler: index.handler memorySize: 128 timeout: 60Edit file
index.py. Contoh berikut:# -*- coding: utf-8 -*- import logging # Untuk mengaktifkan fitur inisialisasi # harap implementasikan fungsi inisialisasi sebagai berikut: # def initializer(context): # logger = logging.getLogger() # logger.info('initializing') def handler(event, context): logger = logging.getLogger() logger.info('hello async callback fail') return 'hello async callback fail'
Terapkan kode ke Function Compute.
s deployAnda dapat melihat fungsi yang telah diterapkan di Function Compute console.
Aktifkan serta debug fungsi menggunakan mesin lokal.
s invokeSetelah aktivasi selesai,
hello async callback failakan dikembalikan.
Langkah 3: Terapkan fungsi GPU
Buat direktori proyek.
mkdir fc-gpu-async-job&&cd fc-gpu-async-jobBuat file dengan mengikuti struktur direktori berikut. Gunakan konfigurasi parameter aktual saat membuat file.
Struktur Direktori:
├── fc-gpu-async-job ├── code │ ├── app.py │ └── Dockerfile └── s.yamlEdit file s.yaml. Contoh:
edition: 1.0.0 name: gpu-container-demo # access menentukan informasi kunci yang diperlukan oleh aplikasi saat ini. # Untuk informasi tentang cara mengonfigurasi kunci, kunjungi https://www.serverless-devs.com/serverless-devs/command/config. # Untuk informasi tentang urutan penggunaan kunci, kunjungi https://www.serverless-devs.com/serverless-devs/tool. access: default vars: region: cn-shenzhen services: customContainer-demo: component: devsapp/fc props: region: ${vars.region} service: name: tgpu_basic_service internetAccess: true # Dapatkan dokumen konfigurasi logConfig dari https://gitee.com/devsapp/fc/blob/main/docs/zh/yaml/service.md#logconfig. logConfig: project: aliyun**** # Proyek yang menyimpan log permintaan. Anda harus membuat proyek di Layanan Log Sederhana terlebih dahulu. Kami sarankan Anda mengonfigurasi item ini. logstore: func**** # Penyimpanan log yang menyimpan log permintaan. Anda harus membuat Penyimpanan log di Layanan Log Sederhana terlebih dahulu. Kami sarankan Anda mengonfigurasi item ini. enableRequestMetrics: true enableInstanceMetrics: true logBeginRule: DefaultRegex function: name: tgpu_basic_func description: test gpu basic handler: not-used timeout: 600 caPort: 9000 # Anda dapat memilih tipe instans yang dipercepat GPU yang sesuai berdasarkan penggunaan memori GPU aktual. Contoh berikut menunjukkan spesifikasi GPU virtual 1/8: instanceType: fc.gpu.tesla.1 gpuMemorySize: 2048 cpu: 1 memorySize: 4096 diskSize: 512 instanceConcurrency: 1 runtime: custom-container customContainerConfig: # Tentukan informasi gambar Anda. Anda harus membuat instans Personal Edition atau Enterprise Edition Container Registry terlebih dahulu. Anda juga harus membuat namespace dan repositori gambar. image: registry.cn-shenzhen.aliyuncs.com/my****/my**** # Aktifkan percepatan gambar. Fitur ini dapat mengoptimalkan cold start gambar berukuran gigabyte. accelerationType: Default codeUri: ./code # Konfigurasi mode asinkron #Untuk informasi lebih lanjut, lihat https://gitee.com/devsapp/fc/blob/main/docs/zh/yaml/function.md#asyncconfiguration. asyncConfiguration: destination: # Tentukan nama sumber daya cloud Alibaba (ARN) dari fungsi panggilan balik untuk pengaktifan yang gagal. onFailure: "acs:fc:cn-shenzhen:164901546557****:services/async-callback-service.LATEST/functions/async-callback-fail-func" # Tentukan ARN dari fungsi panggilan balik untuk pengaktifan yang berhasil. onSuccess: "acs:fc:cn-shenzhen:164901546557****:services/async-callback-service.LATEST/functions/async-callback-succ-func" statefulInvocation: true triggers: - name: httpTrigger type: http config: authType: anonymous methods: - GETEdit file Dockerfile. Berikut adalah contohnya:
FROM nvidia/cuda:11.0-base FROM ubuntu WORKDIR /usr/src/app RUN apt-get update RUN apt-get install -y python3 COPY . . CMD [ "python3", "-u", "/usr/src/app/app.py" ] EXPOSE 9000Edit file app.py. Contoh:
# -*- coding: utf-8 -*- # python2 dan python3 from __future__ import print_function from http.server import HTTPServer, BaseHTTPRequestHandler import json import sys import logging import os import time host = ('0.0.0.0', 9000) class Resquest(BaseHTTPRequestHandler): def do_GET(self): print("simulasikan skenario eksekusi panjang, tidur selama 10 detik") time.sleep(10) print("tampilkan info GPU saya") msg = os.popen("nvidia-smi -L").read() data = {'result': msg} self.send_response(200) self.send_header('Content-type', 'application/json') self.end_headers() self.wfile.write(json.dumps(data).encode()) if __name__ == '__main__': server = HTTPServer(host, Resquest) print("Memulai server, dengarkan di: %s:%s" % host) server.serve_forever()
Terapkan kode ke Function Compute.
s deployAnda dapat melihat fungsi GPU yang diterapkan serta konfigurasi asinkronnya di Function Compute console.

Aktifkan dan debug fungsi menggunakan mesin lokal.
s invokeSetelah aktivasi selesai,
Hello, World!akan ditampilkan.Kirim tugas asinkron.
Periksa status persiapan percepatan gambar untuk fungsi GPU.
Disarankan untuk memulai tugas asinkron setelah status percepatan gambar berubah menjadi Available. Jika tidak, pengecualian seperti batas waktu tautan dapat terjadi.

Masuk ke Function Compute console. Cari fungsi GPU
tgpu_basic_func. Pada tab Asynchronous Tasks, klik Submit Task.
Setelah eksekusi selesai, status tugas akan berubah menjadi Berhasil.
Anda dapat menemukan fungsi panggilan balik yang dikonfigurasi
async-callback-succ-funcuntuk pengaktifan yang berhasil. Pilih , lalu temukan baris hasil permintaan asinkron untuk memeriksa status keberhasilan pengaktifan.
Informasi Tambahan
Untuk informasi lebih lanjut tentang praktik terbaik fungsi GPU, lihat Studi Kasus untuk Aplikasi GPU Serverless.