Anda dapat mencoba praktik terbaik dari instans yang dipercepat GPU menggunakan konsol Function Compute, SDK, atau Serverless Devs. Topik ini menjelaskan cara menggunakan Serverless Devs dan kode fungsi untuk mentranskode video dari format .mp4 ke .flv. Python digunakan sebagai contoh dalam topik ini.
Skenario dan manfaat
Dengan munculnya skenario aplikasi yang sangat interaktif seperti siaran langsung sosial, kelas online, dan telemedis, lalu lintas internet waktu nyata dan hampir waktu nyata menjadi tren. Dalam banyak kasus, platform video harus mentranskode konten video sumber untuk menghasilkan beberapa format distribusi video dalam rasio 1:N berdasarkan faktor-faktor seperti bitrate, resolusi, patch saluran, dan platform pemutaran guna memberikan penonton di berbagai platform dengan kualitas jaringan yang berbeda. Transkoding video adalah langkah kunci dalam produksi dan distribusi video. Solusi transkoding video yang ideal harus hemat biaya dalam hal biaya (CNY/stream) dan efisiensi daya (watts/stream).
Bagian ini menjelaskan manfaat instans yang dipercepat GPU dibandingkan dengan instans tanpa akselerasi GPU di Function Compute:
Skenario Aplikasi Waktu Nyata dan Hampir Waktu Nyata
Instans yang dipercepat GPU dapat mentranskode video beberapa kali lebih cepat dan mendorong konten produksi kepada pengguna secara lebih efisien.
Skenario Aplikasi GPU yang Memrioritaskan Biaya
Instans yang dipercepat GPU dapat disediakan secara elastis berdasarkan kebutuhan bisnis Anda, dan lebih hemat biaya daripada mesin virtual (VM) yang dibeli sendiri.
Skenario Aplikasi GPU yang Memrioritaskan Efisiensi
Fokus pada pengembangan kode dan tujuan bisnis tanpa perlu melakukan operasi dan pemeliharaan kluster GPU, seperti manajemen driver dan versi CUDA, manajemen operasi mesin, serta manajemen GPU yang rusak.
Untuk informasi lebih lanjut tentang instans yang dipercepat GPU, lihat Jenis Instans dan Mode Instans.
Perbandingan kinerja
Instans yang dipercepat GPU dari Function Compute didasarkan pada arsitektur Turing dan mendukung format penyandian dan dekode berikut:
Format Penyandian
H.264 (AVCHD) YUV 4:2:0
H.264 (AVCHD) YUV 4:4:4
H.264 (AVCHD) Lossless
H.265 (HEVC) 4K YUV 4:2:0
H.265 (HEVC) 4K YUV 4:4:4
H.265 (HEVC) 4K Lossless
H.265 (HEVC) 8k
HEVC10-bitsupport
HEVCB Framesupport
Format Dekode
MPEG-1
MPEG-2
VC-1
VP8
VP9
H.264 (AVCHD)
H.265 (HEVC) 4:2:0
*H.265 (HEVC) 4:4:4
8 bit
10 bit
12 bit
8 bit
10 bit
12 bit
8 bit
10 bit
12 bit
Tabel berikut menunjukkan informasi tentang video sumber.
Item | Nilai |
Durasi | 2 menit dan 5 detik |
Bitrate | 4085 Kb/s |
Informasi aliran video | h264 (High), yuv420p (progressive), 1920x1080 [SAR 1:1 DAR 16:9], 25 fps, 25 tbr, 1k tbn, 50 tbc |
Informasi audio dan video | aac (LC), 44100 Hz, stereo, fltp |
Tabel berikut menunjukkan informasi tentang mesin uji yang menggunakan akselerasi GPU dan mesin tanpa akselerasi GPU.
Item | Mesin tanpa akselerasi GPU | Mesin dengan akselerasi GPU |
CPU | CPU Xeon® Platinum 8163 4C | CPU Xeon® Platinum 8163 4C |
RAM | 16 GB | 16 GB |
GPU | N/A | T4 |
FFmpeg | git-2020-08-12-1201687 | git-2020-08-12-1201687 |
Transkoding Video (1:1)
Uji Kinerja: 1 Aliran Masukan dan 1 Aliran Keluaran
Resolusi | Durasi transkoding tanpa akselerasi GPU | Durasi transkoding dengan akselerasi GPU |
H264∶1920x1080 (1080p) (Full HD) | 3 menit dan 19,331 detik | 9,399 detik |
H264∶1280x720 (720p) (Half HD) | 2 menit dan 3,708 detik | 5,791 detik |
H264∶640x480 (480p) | 1 menit dan 1,018 detik | 5,753 detik |
H264∶480x360 (360p) | 44,376 detik | 5,749 detik |
Transkoding Video (1:N)
Uji Kinerja: 1 Aliran Masukan dan 3 Aliran Keluaran
Resolusi | Durasi transkoding tanpa akselerasi GPU | Durasi transkoding dengan akselerasi GPU |
H264∶1920x1080 (1080p) (Full HD) | 5 menit dan 58,696 detik | 45,268 detik |
H264∶1280x720 (720p) (Half HD) | ||
H264∶640x480 (480p) |
Perintah transkoding
Perintah untuk Transkoding Tanpa Akselerasi GPU
Transkoding Aliran Tunggal (1:1)
docker run --rm -it --volume $PWD:/workspace --runtime=nvidia willprice/nvidia-ffmpeg -y -i input.mp4 -c:v h264 -vf scale=1920:1080 -b:v 5M output.mp4Transkoding Multi-Aliran (1:N)
docker run --rm -it --volume $PWD:/workspace --runtime=nvidia willprice/nvidia-ffmpeg \ -y -i input.mp4 \ -c:a copy -c:v h264 -vf scale=1920:1080 -b:v 5M output_1080.mp4 \ -c:a copy -c:v h264 -vf scale=1280:720 -b:v 5M output_720.mp4 \ -c:a copy -c:v h264 -vf scale=640:480 -b:v 5M output_480.mp4
Tabel 1. Deskripsi Parameter Parameter
Deskripsi
-c:a copy
Aliran audio dapat disalin tanpa rekoding.
-c:v h264
Pilih penyandi H.264 perangkat lunak untuk aliran keluaran.
-b:v 5M
Tetapkan bitrate keluaran menjadi 5 Mb/s.
Perintah untuk Transkoding dengan Akselerasi GPU
Transkoding Aliran Tunggal (1:1)
docker run --rm -it --volume $PWD:/workspace --runtime=nvidia willprice/nvidia-ffmpeg -y -hwaccel cuda -hwaccel_output_format cuda -i input.mp4 -c:v h264_nvenc -vf scale_cuda=1920:1080:1:4 -b:v 5M output.mp4Transkoding Multi-Aliran (1:N)
docker run --rm -it --volume $PWD:/workspace --runtime=nvidia willprice/nvidia-ffmpeg \ -y -hwaccel cuda -hwaccel_output_format cuda -i input.mp4 \ -c:a copy -c:v h264_nvenc -vf scale_npp=1920:1080 -b:v 5M output_1080.mp4 \ -c:a copy -c:v h264_nvenc -vf scale_npp=1280:720 -b:v 5M output_720.mp4 \ -c:a copy -c:v h264_nvenc -vf scale_npp=640:480 -b:v 5M output_480.mp4
Tabel 2. Deskripsi Parameter Parameter
Deskripsi
-hwaccel cuda
Pilih akselerator perangkat keras yang sesuai.
-hwaccel_output_format cuda
Simpan frame yang didekodekan di Memori GPU.
-c:v h264_nvenc
Gunakan perangkat keras NVIDIA untuk mempercepat penyandi H.264.
Persiapan
Untuk pengalaman pengguna terbaik, bergabunglah dengan grup DingTalk (ID 11721331) dan berikan informasi berikut:
Nama organisasi, seperti nama perusahaan Anda.
ID Akun Alibaba Cloud Anda.
Wilayah tempat Anda ingin menggunakan instans yang dipercepat GPU, seperti Tiongkok (Shenzhen).
Informasi kontak, seperti nomor ponsel, alamat email, atau akun DingTalk Anda.
Lakukan operasi berikut di wilayah tempat instans yang dipercepat GPU berada:
Buat instance Container Registry Enterprise Edition atau Personal Edition. Kami merekomendasikan agar Anda membuat instance Enterprise Edition. Untuk informasi lebih lanjut, lihat Langkah 1: Buat Instance Container Registry Enterprise Edition.
Buat namespace dan repositori gambar. Untuk informasi lebih lanjut, lihat Langkah 2: Buat Namespace dan Langkah 3: Buat Repositori Gambar.
Kompilasi FFmpeg.
FFmpeg harus dikompilasi sebelum Anda dapat menggunakan akselerasi GPU. Berikut adalah cara mengompilasi FFmpeg:
(Direkomendasikan) Gunakan FFmpeg yang sudah dikompilasi melalui Docker. Alamat unduhan: nvidia-ffmpeg atau ffmpeg.
Kompilasi Manual FFmpeg. Untuk informasi lebih lanjut, lihat Panduan Kompilasi.
Unggah sumber daya audio dan video yang ingin diproses ke bucket Object Storage Service (OSS) di wilayah tempat instans yang dipercepat GPU berada. Pastikan Anda memiliki izin baca dan tulis pada objek di bucket tersebut. Untuk informasi lebih lanjut tentang cara mengunggah sumber daya audio dan video, lihat Unggah Objek. Untuk informasi lebih lanjut tentang izin, lihat Ubah ACL Bucket.
Deploy aplikasi GPU menggunakan Serverless Devs
Before you start
Procedure
Buat proyek.
s init devsapp/start-fc-custom-container-event-python3.9 -d fc-gpu-prjKode sampel berikut menunjukkan direktori proyek yang dibuat:
fc-gpu-prj ├── code │ ├── app.py # Kode fungsi. │ └── Dockerfile # Dockerfile: Image Dockerfile yang berisi kode. ├── README.md └── s.yaml # Konfigurasi proyek, yang menentukan bagaimana image diterapkan di Function ComputeMasuk ke direktori proyek.
cd fc-gpu-prjUbah konfigurasi parameter dalam file berikut sesuai kebutuhan bisnis Anda.
Edit file s.yaml.
Untuk informasi lebih lanjut tentang parameter dalam file YAML, lihat Spesifikasi YAML.
edition: 1.0.0 name: container-demo access: default vars: region: cn-shenzhen services: customContainer-demo: component: devsapp/fc props: region: ${vars.region} service: name: tgpu_ffmpeg_service internetAccess: true function: name: tgpu_ffmpeg_func description: test gpu for ffmpeg handler: not-used timeout: 600 caPort: 9000 instanceType: fc.gpu.tesla.1 gpuMemorySize: 8192 cpu: 4 memorySize: 16384 diskSize: 512 runtime: custom-container customContainerConfig: #1. Pastikan namespace:demo dan repositori repo:gpu-transcoding_s telah dibuat sebelumnya di Alibaba Cloud Container Registry. #2. Ubah tag dari v0.1 menjadi v0.2 saat Anda memperbarui fungsi nanti dan jalankan s build && s deploy lagi. image: registry.cn-shanghai.aliyuncs.com/demo/gpu-transcoding_s:v0.1 codeUri: ./codeEdit 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 import urllib.request import subprocess class Resquest(BaseHTTPRequestHandler): def download(self, url, path): print("masuk download:", url) f = urllib.request.urlopen(url) with open(path, "wb") as local_file: local_file.write(f.read()) def upload(self, url, path): print("masuk upload:", url) headers = { 'Content-Type': 'application/octet-stream', 'Content-Length': os.stat(path).st_size, } req = urllib.request.Request(url, open(path, 'rb'), headers=headers, method='PUT') urllib.request.urlopen(req) def trans(self, input_path, output_path, enable_gpu): print("masuk trans input:", input_path, " output:", output_path, " enable_gpu:", enable_gpu) cmd = ['ffmpeg', '-y', '-i', input_path, "-c:a", "copy", "-c:v", "h264", "-b:v", "5M", output_path] if enable_gpu: cmd = ["ffmpeg", "-y", "-hwaccel", "cuda", "-hwaccel_output_format", "cuda", "-i", input_path, "-c:v", "h264_nvenc", "-b:v", "5M", output_path] try: subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, check=True) except subprocess.CalledProcessError as exc: print('\nreturncode:{}'.format(exc.returncode)) print('\ncmd:{}'.format(exc.cmd)) print('\noutput:{}'.format(exc.output)) print('\nstderr:{}'.format(exc.stderr)) print('\nstdout:{}'.format(exc.stdout)) def trans_wrapper(self, enable_gpu): src_url = "https://your.domain/input.mp4" # Gunakan jalur objek OSS di bawah akun Alibaba Cloud Anda. Anda harus memiliki izin baca dan tulis pada objek tersebut. dst_url = "https://your.domain/output.flv" # Gunakan jalur objek OSS di bawah akun Alibaba Cloud Anda. Anda harus memiliki izin baca dan tulis pada objek tersebut. src_path = "/tmp/input_c.flv" dst_path = "/tmp/output_c.mp4" if enable_gpu: src_url = "https://your.domain/input.mp4" # Gunakan jalur objek OSS di bawah akun Alibaba Cloud Anda. Anda harus memiliki izin baca dan tulis pada objek tersebut. dst_url = "https://your.domain/output.flv" # Gunakan jalur objek OSS di bawah akun Alibaba Cloud Anda. Anda harus memiliki izin baca dan tulis pada objek tersebut. src_path = "/tmp/input_g.flv" dst_path = "/tmp/output_g.mp4" local_time = time.time() self.download(src_url, src_path) download_time = time.time() - local_time local_time = time.time() self.trans(src_path, dst_path, enable_gpu) trans_time = time.time() - local_time local_time = time.time() self.upload(dst_url, dst_path) upload_time = time.time() - local_time data = {'result':'ok', 'download_time':download_time, 'trans_time':trans_time, 'upload_time':upload_time} self.send_response(200) self.send_header('Content-type', 'application/json') self.end_headers() self.wfile.write(json.dumps(data).encode()) def pong(self): data = {"function":"trans_gpu"} self.send_response(200) self.send_header('Content-type', 'application/json') self.end_headers() self.wfile.write(json.dumps(data).encode()) def dispatch(self): mode = self.headers.get('TRANS-MODE') if mode == "ping": self.pong() elif mode == "gpu": self.trans_wrapper(True) elif mode == "cpu": self.trans_wrapper(False) else: self.pong() def do_GET(self): self.dispatch() def do_POST(self): self.dispatch() if __name__ == '__main__': host = ('0.0.0.0', 9000) server = HTTPServer(host, Resquest) print("Memulai server, mendengarkan pada: %s:%s" % host) server.serve_forever()Edit file Dockerfile.
Contoh:
FROM registry.cn-shanghai.aliyuncs.com/serverless_devs/nvidia-ffmpeg:latest WORKDIR /usr/src/app RUN apt-get update --fix-missing RUN apt-get install -y python3 RUN apt-get install -y python3-pip COPY . . ENTRYPOINT [ "python3", "-u", "/usr/src/app/app.py" ] EXPOSE 9000
Bangun sebuah image.
s build --dockerfile ./code/DockerfileDeploy kode ke Function Compute.
s deployCatatanJika Anda menjalankan perintah di atas berulang kali dan nama layanan serta fungsi tetap tidak berubah, jalankan perintah
use localuntuk menggunakan konfigurasi lokal.Konfigurasikan instans yang disediakan.
s provision put --target 1 --qualifier LATESTPeriksa apakah instans yang disediakan sudah siap.
s provision get --qualifier LATESTJika nilai
currentadalah 1, mode penyediaan instans yang dipercepat GPU sudah siap. Contoh:[2021-12-14 08:45:24] [INFO] [S-CLI] - Mulai ... [2021-12-14 08:45:24] [INFO] [FC] - Mendapatkan penyediaan: tgpu_ffmpeg_service.LATEST/tgpu_ffmpeg_func customContainer-demo: serviceName: tgpu_ffmpeg_service functionName: tgpu_ffmpeg_func qualifier: LATEST resource: 188077086902****#tgpu_ffmpeg_service#LATEST#tgpu_ffmpeg_func target: 1 current: 1 scheduledActions: (array kosong) targetTrackingPolicies: (array kosong) currentError:Panggil fungsi.
Lihat Versi Fungsi Online
s invokeGunakan CPU untuk Transkoding
s invoke -e '{"method":"GET","headers":{"TRANS-MODE":"cpu"}}'Gunakan GPU untuk Transkoding
s invoke -e '{"method":"GET","headers":{"TRANS-MODE":"gpu"}}'
Lepaskan instans yang dipercepat GPU.
s provision put --target 0 --qualifier LATEST
Gunakan konsol Function Compute untuk menerapkan aplikasi GPU
Terapkan sebuah image.
Buat instance Container Registry Enterprise Edition atau Container Registry Personal Edition.
Kami merekomendasikan agar Anda membuat instance Enterprise Edition. Untuk informasi lebih lanjut, lihat Buat Instance Container Registry Enterprise Edition.
Buat namespace dan repositori gambar.
Untuk informasi lebih lanjut, lihat bagian Langkah 2: Buat Namespace dan Langkah 3: Buat Repositori Gambar dari topik "Gunakan Instance Container Registry Enterprise Edition untuk Membangun Gambar".
Lakukan operasi pada Docker sesuai petunjuk di Konsol Container Registry. Kemudian, dorong sampel app.py dan Dockerfile sebelumnya ke repositori gambar instance. Untuk informasi lebih lanjut tentang file-file tersebut, lilihat app.py dan Dockerfile di direktori /code saat Anda menerapkan aplikasi GPU menggunakan Serverless Devs.

Buat layanan. Untuk informasi lebih lanjut, lihat bagian "Buat Layanan" dari Kelola Layanan.
Buat fungsi. Untuk informasi lebih lanjut, lihat Buat Fungsi Kontainer Kustom.
CatatanPilih GPU Instance untuk Instance Type dan Process HTTP Requests untuk Request Handler Type.
Ubah periode batas waktu eksekusi fungsi.
Temukan fungsi yang ingin Anda kelola dan klik Configure di kolom Actions.
Di bagian Environment Information, ubah nilai Execution Timeout Period dan klik Save.

CatatanDurasi transkoding menggunakan CPU melebihi nilai default 60 detik. Oleh karena itu, kami merekomendasikan agar Anda menetapkan nilai Execution Timeout Period menjadi nilai yang lebih besar.
Konfigurasikan instans GPU yang disediakan.
Di halaman Detail Fungsi, klik tab Auto Scaling dan klik Create Rule.
Di halaman yang muncul, konfigurasikan parameter berikut untuk menyediakan instans yang dipercepat GPU dan klik Create.
Untuk informasi lebih lanjut tentang cara mengonfigurasi instans yang disediakan, lihat Konfigurasikan Aturan Penskalaan Otomatis.

Setelah konfigurasi selesai, Anda dapat memeriksa apakah instans GPU yang disediakan sudah siap di daftar aturan. Secara spesifik, periksa apakah nilai Current Reserved Instances adalah jumlah instans yang disediakan yang ditentukan.
Gunakan cURL untuk Menguji Fungsi
Di halaman detail fungsi, klik tab Triggers untuk melihat konfigurasi pemicu dan mendapatkan titik akhir pemicu.
Jalankan perintah berikut di antarmuka baris perintah (CLI) untuk memanggil fungsi GPU:
Lihat Versi Fungsi Online
curl -v "https://tgpu-ff-console-tgpu-ff-console-ajezot****.cn-shenzhen.fcapp.run" {"function": "trans_gpu"}Gunakan CPU untuk Transkoding
curl "https://tgpu-ff-console-tgpu-ff-console-ajezot****.cn-shenzhen.fcapp.run" -H 'TRANS-MODE: cpu' {"result": "ok", "upload_time": 8.75510573387146, "download_time": 4.910430669784546, "trans_time": 105.37688875198364}Gunakan GPU untuk Transkoding
curl "https://tgpu-ff-console-tgpu-ff-console-ajezotchpx.cn-shenzhen.fcapp.run" -H 'TRANS-MODE: gpu' {"result": "ok", "upload_time": 8.313958644866943, "download_time": 5.096682548522949, "trans_time": 8.72346019744873}
Hasil
Anda dapat melihat video setelah transkoding dengan mengakses domain berikut di browser Anda:
https://cri-zbtsehbrr8******-registry.oss-cn-shenzhen.aliyuncs.com/output.flvDomain ini digunakan sebagai contoh. Domain aktual yang berlaku.