Tolok ukur dan optimalkan penerapan titik akhir di Amazon SageMaker JumpStart | Layanan Web Amazon

Tolok ukur dan optimalkan penerapan titik akhir di Amazon SageMaker JumpStart | Layanan Web Amazon

Saat menerapkan model bahasa besar (LLM), praktisi pembelajaran mesin (ML) biasanya memperhatikan dua pengukuran kinerja penyajian model: latensi, yang ditentukan oleh waktu yang diperlukan untuk menghasilkan satu token, dan throughput, yang ditentukan oleh jumlah token yang dihasilkan. per detik. Meskipun satu permintaan ke titik akhir yang diterapkan akan menunjukkan throughput yang kira-kira sama dengan kebalikan dari latensi model, hal ini belum tentu terjadi ketika beberapa permintaan bersamaan dikirim ke titik akhir secara bersamaan. Karena teknik penyajian model, seperti pengelompokan permintaan serentak secara terus-menerus di sisi klien, latensi dan throughput memiliki hubungan kompleks yang bervariasi secara signifikan berdasarkan arsitektur model, konfigurasi penyajian, perangkat keras jenis instans, jumlah permintaan serentak, dan variasi muatan masukan seperti sebagai jumlah token masukan dan token keluaran.

Posting ini mengeksplorasi hubungan ini melalui tolok ukur komprehensif LLM yang tersedia di Amazon SageMaker JumpStart, termasuk varian Llama 2, Falcon, dan Mistral. Dengan SageMaker JumpStart, praktisi ML dapat memilih dari beragam pilihan model dasar yang tersedia untuk umum untuk diterapkan ke model khusus Amazon SageMaker contoh dalam lingkungan yang terisolasi jaringan. Kami memberikan prinsip teoretis tentang bagaimana spesifikasi akselerator memengaruhi tolok ukur LLM. Kami juga menunjukkan dampak penerapan beberapa instance di belakang satu titik akhir. Terakhir, kami memberikan rekomendasi praktis untuk menyesuaikan proses penerapan SageMaker JumpStart agar selaras dengan kebutuhan Anda mengenai latensi, throughput, biaya, dan batasan pada jenis instans yang tersedia. Semua hasil benchmarking serta rekomendasi didasarkan pada berbagai hal buku catatan yang dapat Anda sesuaikan dengan kasus penggunaan Anda.

Pembandingan titik akhir yang diterapkan

Gambar berikut menunjukkan nilai latensi terendah (kiri) dan throughput tertinggi (kanan) untuk konfigurasi penerapan di berbagai tipe model dan tipe instans. Yang penting, setiap penerapan model ini menggunakan konfigurasi default seperti yang disediakan oleh SageMaker JumpStart dengan mempertimbangkan ID model dan jenis instans yang diinginkan untuk penerapan.

Tolok ukur dan optimalkan penerapan titik akhir di Amazon SageMaker JumpStart | Kecerdasan Data PlatoBlockchain Layanan Web Amazon. Pencarian Vertikal. Ai.

Nilai latensi dan throughput ini sesuai dengan muatan dengan 256 token masukan dan 256 token keluaran. Konfigurasi latensi terendah membatasi model yang melayani satu permintaan serentak, dan konfigurasi throughput tertinggi memaksimalkan kemungkinan jumlah permintaan serentak. Seperti yang bisa kita lihat dalam tolok ukur kami, peningkatan permintaan serentak secara monoton meningkatkan throughput dengan penurunan peningkatan untuk permintaan serentak yang besar. Selain itu, model dipecah sepenuhnya pada instans yang didukung. Misalnya, karena instance ml.g5.48xlarge memiliki 8 GPU, semua model SageMaker JumpStart yang menggunakan instance ini dipecah menggunakan paralelisme tensor pada kedelapan akselerator yang tersedia.

Kita dapat mencatat beberapa kesimpulan dari gambar ini. Pertama, tidak semua model didukung di semua contoh; beberapa model yang lebih kecil, seperti Falcon 7B, tidak mendukung sharding model, sedangkan model yang lebih besar memiliki persyaratan sumber daya komputasi yang lebih tinggi. Kedua, seiring meningkatnya sharding, performa biasanya meningkat, namun belum tentu meningkat untuk model kecilHal ini karena model kecil seperti 7B dan 13B menimbulkan overhead komunikasi yang besar ketika di-sharding ke terlalu banyak akselerator. Kita akan membicarakan hal ini secara lebih mendalam nanti. Terakhir, instans ml.p4d.24xlarge cenderung memiliki throughput yang jauh lebih baik karena peningkatan bandwidth memori pada GPU A100 dibandingkan GPU A10G. Seperti yang akan kita bahas nanti, keputusan untuk menggunakan jenis instans tertentu bergantung pada persyaratan penerapan Anda, termasuk latensi, throughput, dan batasan biaya.

Bagaimana Anda bisa mendapatkan nilai konfigurasi latensi terendah dan throughput tertinggi ini? Mari kita mulai dengan memplot latensi vs. throughput untuk titik akhir Llama 2 7B pada instans ml.g5.12xlarge untuk payload dengan 256 token masukan dan 256 token keluaran, seperti terlihat pada kurva berikut. Kurva serupa ada untuk setiap titik akhir LLM yang diterapkan.

Tolok ukur dan optimalkan penerapan titik akhir di Amazon SageMaker JumpStart | Kecerdasan Data PlatoBlockchain Layanan Web Amazon. Pencarian Vertikal. Ai.

Saat konkurensi meningkat, throughput dan latensi juga meningkat secara monoton. Oleh karena itu, titik latensi terendah terjadi pada nilai permintaan serentak 1, dan Anda dapat meningkatkan throughput sistem secara hemat biaya dengan meningkatkan permintaan serentak. Terdapat ā€œlututā€ yang berbeda dalam kurva ini, yang jelas bahwa peningkatan throughput yang terkait dengan konkurensi tambahan tidak melebihi peningkatan latensi yang terkait. Lokasi pasti dari lutut ini bergantung pada kasus penggunaan; beberapa praktisi mungkin menentukan lutut pada titik di mana persyaratan latensi yang telah ditentukan sebelumnya terlampaui (misalnya, 100 ms/token), sedangkan yang lain mungkin menggunakan tolok ukur uji beban dan metode teori antrian seperti aturan setengah latensi, dan yang lain mungkin menggunakan spesifikasi akselerator teoritis.

Kami juga mencatat bahwa jumlah maksimum permintaan bersamaan terbatas. Pada gambar sebelumnya, jejak garis diakhiri dengan 192 permintaan bersamaan. Sumber batasan ini adalah batas waktu tunggu pemanggilan SageMaker, di mana SageMaker menetapkan waktu tunggu respons pemanggilan setelah 60 detik. Pengaturan ini khusus untuk akun dan tidak dapat dikonfigurasi untuk titik akhir individual. Untuk LLM, menghasilkan token keluaran dalam jumlah besar dapat memakan waktu beberapa detik atau bahkan beberapa menit. Oleh karena itu, muatan masukan atau keluaran yang besar dapat menyebabkan permintaan pemanggilan gagal. Selain itu, jika jumlah permintaan serentak sangat besar, maka banyak permintaan akan mengalami waktu antrian yang besar, sehingga mendorong batas waktu tunggu 60 detik ini. Untuk tujuan penelitian ini, kami menggunakan batas waktu habis untuk menentukan throughput maksimum yang mungkin untuk penerapan model. Yang penting, meskipun titik akhir SageMaker dapat menangani sejumlah besar permintaan serentak tanpa memperhatikan batas waktu respons pemanggilan, Anda mungkin ingin menentukan permintaan serentak maksimum sehubungan dengan lutut dalam kurva latensi-throughput. Ini kemungkinan merupakan titik di mana Anda mulai mempertimbangkan penskalaan horizontal, di mana satu titik akhir menyediakan beberapa instans dengan replika model dan menyeimbangkan beban permintaan masuk antar replika, untuk mendukung permintaan yang lebih bersamaan.

Mengambil satu langkah lebih jauh, tabel berikut berisi hasil benchmarking untuk konfigurasi berbeda untuk model Llama 2 7B, termasuk jumlah token input dan output yang berbeda, jenis instans, dan jumlah permintaan bersamaan. Perhatikan bahwa gambar sebelumnya hanya memplot satu baris tabel ini.

. Throughput (token/dtk) Latensi (ms/token)
Permintaan Bersamaan 1 2 4 8 16 32 64 128 256 512 1 2 4 8 16 32 64 128 256 512
Jumlah total token: 512, Jumlah token keluaran: 256
ml.g5.2xbesar 30 54 115 208 343 475 486 - - - 33 33 35 39 48 97 159 - - -
ml.g5.12xbesar 59 117 223 406 616 866 1098 1214 - - 17 17 18 20 27 38 60 112 - -
ml.g5.48xbesar 56 108 202 366 522 660 707 804 - - 18 18 19 22 32 50 101 171 - -
ml.p4d.24xbesar 49 85 178 353 654 1079 1544 2312 2905 2944 21 23 22 23 26 31 44 58 92 165
Jumlah total token: 4096, Jumlah token keluaran: 256
ml.g5.2xbesar 20 36 48 49 - - - - - - 48 57 104 170 - - - - - -
ml.g5.12xbesar 33 58 90 123 142 - - - - - 31 34 48 73 132 - - - - -
ml.g5.48xbesar 31 48 66 82 - - - - - - 31 43 68 120 - - - - - -
ml.p4d.24xbesar 39 73 124 202 278 290 - - - - 26 27 33 43 66 107 - - - -

Kami mengamati beberapa pola tambahan dalam data ini. Saat meningkatkan ukuran konteks, latensi meningkat dan throughput menurun. Misalnya, pada ml.g5.2xlarge dengan konkurensi 1, throughput adalah 30 token/dtk jika jumlah total token adalah 512, vs. 20 token/dtk jika jumlah total token adalah 4,096. Hal ini karena dibutuhkan waktu lebih lama untuk memproses input yang lebih besar. Kita juga dapat melihat bahwa peningkatan kemampuan GPU dan sharding berdampak pada throughput maksimum dan permintaan serentak maksimum yang didukung. Tabel tersebut menunjukkan bahwa Llama 2 7B memiliki nilai throughput maksimum yang sangat berbeda untuk jenis instans yang berbeda, dan nilai throughput maksimum ini terjadi pada nilai permintaan bersamaan yang berbeda. Karakteristik ini akan mendorong praktisi ML untuk membenarkan biaya suatu instans dibandingkan instans lainnya. Misalnya, dengan adanya persyaratan latensi rendah, praktisi dapat memilih instans ml.g5.12xlarge (4 GPU A10G) dibandingkan instans ml.g5.2xlarge (1 GPU A10G). Jika diberikan persyaratan throughput yang tinggi, penggunaan instance ml.p4d.24xlarge (8 GPU A100) dengan sharding penuh hanya akan dibenarkan dalam konkurensi tinggi. Namun, perhatikan bahwa sering kali bermanfaat untuk memuat beberapa komponen inferensi model 7B pada satu instance ml.p4d.24xlarge; dukungan multi-model tersebut dibahas nanti di posting ini.

Pengamatan sebelumnya dilakukan untuk model Llama 2 7B. Namun, pola serupa juga berlaku untuk model lainnya. Kesimpulan utamanya adalah angka kinerja latensi dan throughput bergantung pada payload, jenis instans, dan jumlah permintaan bersamaan, jadi Anda perlu menemukan konfigurasi ideal untuk aplikasi spesifik Anda. Untuk menghasilkan angka-angka sebelumnya untuk kasus penggunaan Anda, Anda dapat menjalankan link buku catatan, tempat Anda dapat mengonfigurasi analisis pengujian beban ini untuk model, jenis instans, dan payload Anda.

Memahami spesifikasi akselerator

Memilih perangkat keras yang sesuai untuk inferensi LLM sangat bergantung pada kasus penggunaan tertentu, tujuan pengalaman pengguna, dan LLM yang dipilih. Bagian ini mencoba untuk menciptakan pemahaman tentang lutut dalam kurva latensi-throughput sehubungan dengan prinsip tingkat tinggi berdasarkan spesifikasi akselerator. Prinsip-prinsip ini saja tidak cukup untuk mengambil keputusan: diperlukan tolok ukur yang nyata. Syarat alat digunakan di sini untuk mencakup semua akselerator perangkat keras ML. Kami menegaskan bahwa titik terendah dalam kurva latensi-throughput didorong oleh salah satu dari dua faktor:

  • Akselerator telah kehabisan memori untuk menyimpan cache matriks KV, sehingga permintaan berikutnya dimasukkan ke dalam antrean
  • Akselerator masih memiliki memori cadangan untuk cache KV, namun menggunakan ukuran batch yang cukup besar sehingga waktu pemrosesan didorong oleh latensi operasi komputasi, bukan bandwidth memori

Kami biasanya memilih untuk dibatasi oleh faktor kedua karena ini berarti sumber daya akselerator sudah jenuh. Pada dasarnya, Anda memaksimalkan sumber daya yang Anda bayarkan. Mari kita jelajahi pernyataan ini secara lebih rinci.

Caching KV dan memori perangkat

Mekanisme perhatian transformator standar menghitung perhatian untuk setiap token baru terhadap semua token sebelumnya. Sebagian besar server ML modern menyimpan kunci dan nilai perhatian dalam memori perangkat (DRAM) untuk menghindari penghitungan ulang di setiap langkah. Ini disebut ini cache KV, dan itu bertambah seiring ukuran batch dan panjang urutan. Ini menentukan berapa banyak permintaan pengguna yang dapat dilayani secara paralel dan akan menentukan titik dalam kurva latensi-throughput jika rezim terikat komputasi dalam skenario kedua yang disebutkan sebelumnya belum terpenuhi, mengingat DRAM yang tersedia. Rumus berikut adalah perkiraan kasar untuk ukuran cache KV maksimum.

Tolok ukur dan optimalkan penerapan titik akhir di Amazon SageMaker JumpStart | Kecerdasan Data PlatoBlockchain Layanan Web Amazon. Pencarian Vertikal. Ai.

Dalam rumus ini, B adalah ukuran batch dan N adalah jumlah akselerator. Misalnya, model Llama 2 7B di FP16 (2 byte/parameter) yang disajikan pada GPU A10G (DRAM 24 GB) mengonsumsi sekitar 14 GB, menyisakan 10 GB untuk cache KV. Memasukkan panjang konteks penuh model (N = 4096) dan parameter lainnya (n_layers=32, n_kv_attention_heads=32, dan d_attention_head=128), ekspresi ini menunjukkan bahwa kami dibatasi untuk melayani ukuran batch empat pengguna secara paralel karena kendala DRAM . Jika Anda mengamati tolok ukur yang sesuai pada tabel sebelumnya, ini adalah perkiraan yang baik untuk lutut yang diamati dalam kurva throughput latensi ini. Metode seperti perhatian kueri yang dikelompokkan (GQA) dapat mengurangi ukuran cache KV, dalam kasus GQA dengan faktor yang sama mengurangi jumlah kepala KV.

Intensitas aritmatika dan bandwidth memori perangkat

Pertumbuhan kekuatan komputasi akselerator ML telah melampaui bandwidth memorinya, yang berarti mereka dapat melakukan lebih banyak komputasi pada setiap byte data dalam jumlah waktu yang diperlukan untuk mengakses byte tersebut.

Grafik intensitas aritmatika, atau rasio operasi komputasi terhadap akses memori, untuk suatu operasi menentukan apakah operasi tersebut dibatasi oleh bandwidth memori atau kapasitas komputasi pada perangkat keras yang dipilih. Misalnya, GPU A10G (keluarga tipe instans g5) dengan 70 TFLOPS FP16 dan bandwidth 600 GB/dtk dapat menghitung sekitar 116 ops/byte. GPU A100 (keluarga tipe instans p4d) dapat menghitung sekitar 208 ops/byte. Jika intensitas aritmatika untuk model transformator berada di bawah nilai tersebut, maka model tersebut terikat memori; jika berada di atas, maka terikat pada komputasi. Mekanisme perhatian untuk Llama 2 7B membutuhkan 62 ops/byte untuk ukuran batch 1 (untuk penjelasan lihat Panduan untuk inferensi dan kinerja LLM), yang berarti terikat pada memori. Ketika mekanisme perhatian terikat pada memori, FLOPS yang mahal tidak digunakan.

Ada dua cara untuk memanfaatkan akselerator dengan lebih baik dan meningkatkan intensitas aritmatika: mengurangi akses memori yang diperlukan untuk operasi tersebut (inilah yang FlashPerhatian berfokus pada) atau meningkatkan ukuran batch. Namun, kami mungkin tidak dapat meningkatkan ukuran batch hingga mencapai rezim terikat komputasi jika DRAM kami terlalu kecil untuk menampung cache KV yang sesuai. Perkiraan kasar ukuran batch kritis B* yang memisahkan rezim terikat komputasi dan terikat memori untuk inferensi dekoder GPT standar dijelaskan dengan ekspresi berikut, dengan A_mb adalah bandwidth memori akselerator, A_f adalah FLOPS akselerator, dan N adalah angkanya akselerator. Ukuran batch kritis ini dapat diperoleh dengan mencari waktu akses memori sama dengan waktu komputasi. Mengacu pada posting blog ini untuk memahami Persamaan 2 dan asumsinya secara lebih rinci.

Tolok ukur dan optimalkan penerapan titik akhir di Amazon SageMaker JumpStart | Kecerdasan Data PlatoBlockchain Layanan Web Amazon. Pencarian Vertikal. Ai.

Ini adalah rasio ops/byte yang sama yang kami hitung sebelumnya untuk A10G, jadi ukuran batch kritis pada GPU ini adalah 116. Salah satu cara untuk mendekati ukuran batch teoritis dan kritis ini adalah dengan meningkatkan sharding model dan membagi cache ke lebih banyak akselerator N. Hal ini secara efektif meningkatkan kapasitas cache KV serta ukuran batch yang terikat memori.

Manfaat lain dari model sharding adalah membagi parameter model dan pekerjaan pemuatan data di seluruh N akselerator. Jenis sharding ini adalah jenis paralelisme model yang juga disebut sebagai paralelisme tensor. Naifnya, ada N kali lipat bandwidth memori dan daya komputasi secara agregat. Dengan asumsi tidak ada overhead dalam bentuk apa pun (komunikasi, perangkat lunak, dan sebagainya), hal ini akan menurunkan latensi pengodean ulang per token sebesar N jika kita terikat pada memori, karena latensi pengodean token dalam rezim ini dibatasi oleh waktu yang diperlukan untuk memuat model bobot dan cache. Namun, dalam kehidupan nyata, meningkatkan derajat sharding akan meningkatkan komunikasi antar perangkat untuk berbagi aktivasi perantara di setiap lapisan model. Kecepatan komunikasi ini dibatasi oleh bandwidth interkoneksi perangkat. Sulit untuk memperkirakan dampaknya secara tepat (untuk rinciannya, lihat Paralelisme model), namun hal ini pada akhirnya tidak lagi memberikan manfaat atau menurunkan kinerja ā€” hal ini terutama berlaku untuk model yang lebih kecil, karena transfer data yang lebih kecil menyebabkan kecepatan transfer yang lebih rendah.

Untuk membandingkan akselerator ML berdasarkan spesifikasinya, kami merekomendasikan hal berikut. Pertama, hitung perkiraan ukuran batch kritis untuk setiap jenis akselerator menurut persamaan kedua dan ukuran cache KV untuk ukuran batch kritis menurut persamaan pertama. Anda kemudian dapat menggunakan DRAM yang tersedia pada akselerator untuk menghitung jumlah minimum akselerator yang diperlukan agar sesuai dengan cache KV dan parameter model. Jika memutuskan antara beberapa akselerator, prioritaskan akselerator dalam urutan biaya terendah per GB/detik bandwidth memori. Terakhir, lakukan benchmark pada konfigurasi ini dan verifikasi berapa biaya/token terbaik untuk batas atas latensi yang Anda inginkan.

Pilih konfigurasi penerapan titik akhir

Banyak LLM yang didistribusikan oleh SageMaker JumpStart menggunakan inferensi pembuatan teks (TGI) Wadah SageMaker untuk penyajian model. Tabel berikut membahas cara menyesuaikan berbagai parameter penyajian model untuk memengaruhi penyajian model yang berdampak pada kurva latensi-throughput atau melindungi titik akhir terhadap permintaan yang akan membebani titik akhir. Ini adalah parameter utama yang dapat Anda gunakan untuk mengonfigurasi penerapan titik akhir untuk kasus penggunaan Anda. Kecuali ditentukan lain, kami menggunakan default parameter muatan pembuatan teks dan Variabel lingkungan TGI.

Variabel Lingkungan Deskripsi Produk Nilai Default SageMaker JumpStart
Konfigurasi penyajian model . .
MAX_BATCH_PREFILL_TOKENS Membatasi jumlah token dalam operasi pra-pengisian. Operasi ini menghasilkan cache KV untuk urutan prompt masukan baru. Ini memerlukan banyak memori dan terikat pada komputasi, sehingga nilai ini membatasi jumlah token yang diizinkan dalam satu operasi pra-pengisian. Langkah-langkah penguraian kode untuk kueri lain dijeda saat pengisian awal dilakukan. 4096 (default TGI) atau panjang konteks maksimum yang didukung spesifik model (disediakan SageMaker JumpStart), mana saja yang lebih besar.
MAX_BATCH_TOTAL_TOKENS Mengontrol jumlah maksimum token untuk disertakan dalam satu batch selama decoding, atau satu penerusan melalui model. Idealnya, ini diatur untuk memaksimalkan penggunaan semua perangkat keras yang tersedia. Tidak ditentukan (default TGI). TGI akan menetapkan nilai ini sehubungan dengan sisa memori CUDA selama pemanasan model.
SM_NUM_GPUS Jumlah pecahan yang akan digunakan. Artinya, jumlah GPU yang digunakan untuk menjalankan model menggunakan paralelisme tensor. Bergantung pada instans (SageMaker JumpStart disediakan). Untuk setiap instans yang didukung untuk model tertentu, SageMaker JumpStart memberikan pengaturan terbaik untuk paralelisme tensor.
Konfigurasi untuk melindungi titik akhir Anda (setel ini untuk kasus penggunaan Anda) . .
MAX_TOTAL_TOKENS Hal ini membatasi anggaran memori dari satu permintaan klien dengan membatasi jumlah token dalam urutan masukan ditambah jumlah token dalam urutan keluaran ( max_new_tokens parameter muatan). Panjang konteks maksimum yang didukung khusus model. Misalnya, 4096 untuk Llama 2.
MAX_INPUT_LENGTH Mengidentifikasi jumlah token maksimum yang diperbolehkan dalam urutan input untuk satu permintaan klien. Hal-hal yang perlu dipertimbangkan saat meningkatkan nilai ini meliputi: urutan masukan yang lebih panjang memerlukan lebih banyak memori, yang memengaruhi pengelompokan berkelanjutan, dan banyak model memiliki panjang konteks yang didukung yang tidak boleh dilampaui. Panjang konteks maksimum yang didukung khusus model. Misalnya, 4095 untuk Llama 2.
MAX_CONCURRENT_REQUESTS Jumlah maksimum permintaan serentak yang diizinkan oleh titik akhir yang disebarkan. Permintaan baru yang melampaui batas ini akan segera memunculkan kesalahan model yang kelebihan beban untuk mencegah latensi buruk untuk permintaan pemrosesan saat ini. 128 (standar TGI). Pengaturan ini memungkinkan Anda memperoleh throughput tinggi untuk berbagai kasus penggunaan, namun Anda harus memasang pin yang sesuai untuk mengurangi kesalahan batas waktu pemanggilan SageMaker.

Server TGI menggunakan pengelompokan berkelanjutan, yang secara dinamis mengelompokkan permintaan serentak untuk berbagi satu penerusan inferensi model. Ada dua jenis forward pass: prefill dan decode. Setiap permintaan baru harus menjalankan satu penerusan prefill untuk mengisi cache KV untuk token urutan input. Setelah cache KV diisi, penerusan dekode melakukan prediksi token berikutnya untuk semua permintaan batch, yang diulangi secara berulang untuk menghasilkan urutan keluaran. Saat permintaan baru dikirim ke server, langkah dekode berikutnya harus menunggu agar langkah pra-pengisian dapat dijalankan untuk permintaan baru. Hal ini harus terjadi sebelum permintaan baru tersebut disertakan dalam langkah-langkah dekode batch yang berkelanjutan. Karena kendala perangkat keras, pengelompokan berkelanjutan yang digunakan untuk decoding mungkin tidak mencakup semua permintaan. Pada titik ini, permintaan memasuki antrean pemrosesan dan latensi inferensi mulai meningkat secara signifikan dengan peningkatan throughput yang kecil.

Analisis pembandingan latensi LLM dapat dipisahkan menjadi latensi pra-pengisian, latensi dekode, dan latensi antrean. Waktu yang digunakan oleh masing-masing komponen ini pada dasarnya berbeda: pengisian awal adalah perhitungan satu kali, penguraian kode terjadi satu kali untuk setiap token dalam urutan keluaran, dan antrian melibatkan proses pengelompokan server. Ketika beberapa permintaan serentak diproses, menjadi sulit untuk menguraikan latensi dari masing-masing komponen ini karena latensi yang dialami oleh permintaan klien tertentu melibatkan latensi antrean yang didorong oleh kebutuhan untuk mengisi terlebih dahulu permintaan serentak yang baru serta latensi antrean yang didorong oleh penyertaan. permintaan dalam proses decoding batch. Karena alasan ini, postingan ini berfokus pada latensi pemrosesan ujung ke ujung. Lutut dalam kurva latensi-throughput terjadi pada titik jenuh di mana latensi antrean mulai meningkat secara signifikan. Fenomena ini terjadi pada server inferensi model apa pun dan didorong oleh spesifikasi akselerator.

Persyaratan umum selama penerapan mencakup pemenuhan throughput minimum yang diperlukan, latensi maksimum yang diperbolehkan, biaya maksimum per jam, dan biaya maksimum untuk menghasilkan 1 juta token. Anda harus mengkondisikan persyaratan ini pada payload yang mewakili permintaan pengguna akhir. Desain untuk memenuhi persyaratan ini harus mempertimbangkan banyak faktor, termasuk arsitektur model spesifik, ukuran model, jenis instans, dan jumlah instans (penskalaan horizontal). Pada bagian berikut, kami fokus pada penerapan titik akhir untuk meminimalkan latensi, memaksimalkan throughput, dan meminimalkan biaya. Analisis ini mempertimbangkan total 512 token dan 256 token keluaran.

Minimalkan latensi

Latensi merupakan persyaratan penting dalam banyak kasus penggunaan real-time. Pada tabel berikut, kita melihat latensi minimum untuk setiap model dan setiap jenis instans. Anda dapat mencapai latensi minimum dengan mengatur MAX_CONCURRENT_REQUESTS = 1.

Latensi Minimum (md/token)
ID Model ml.g5.2xbesar ml.g5.12xbesar ml.g5.48xbesar ml.p4d.24xbesar ml.p4de.24xlarge
Lama 2 7B 33 17 18 20 -
Lama 2 7B Obrolan 33 17 18 20 -
Lama 2 13B - 22 23 23 -
Lama 2 13B Obrolan - 23 23 23 -
Lama 2 70B - - 57 43 -
Lama 2 70B Obrolan - - 57 45 -
Mistral 7B 35 - - - -
Instruksi Mistral 7B 35 - - - -
Campuran 8x7B - - 33 27 -
Elang 7B 33 - - - -
Instruksi Falcon 7B 33 - - - -
Elang 40B - 53 33 27 -
Instruksi Falcon 40B - 53 33 28 -
Elang 180B - - - - 42
Obrolan Falcon 180B - - - - 42

Untuk mencapai latensi minimum suatu model, Anda dapat menggunakan kode berikut sambil mengganti ID model dan jenis instans yang Anda inginkan:

from sagemaker.jumpstart.model import JumpStartModel model = JumpStartModel( model_id="meta-textgeneration-llama-2-7b", model_version="3.*", instance_type="ml.g5.12xlarge", env={ "MAX_CONCURRENT_REQUESTS": "1", "MAX_INPUT_TOKENS": "256", "MAX_TOTAL_TOKENS": "512", },
)
predictor = model.deploy(accept_eula=False) # Change EULA acceptance to True

Perhatikan bahwa angka latensi berubah bergantung pada jumlah token masukan dan keluaran. Namun, proses penerapannya tetap sama kecuali variabel lingkungan MAX_INPUT_TOKENS dan MAX_TOTAL_TOKENS. Di sini, variabel lingkungan ini ditetapkan untuk membantu menjamin persyaratan latensi titik akhir karena urutan masukan yang lebih besar mungkin melanggar persyaratan latensi. Perhatikan bahwa SageMaker JumpStart telah menyediakan variabel lingkungan optimal lainnya saat memilih jenis instans; misalnya, menggunakan ml.g5.12xlarge akan disetel SM_NUM_GPUS ke 4 di lingkungan model.

Maksimalkan keluaran

Di bagian ini, kami memaksimalkan jumlah token yang dihasilkan per detik. Hal ini biasanya dicapai pada permintaan bersamaan maksimum yang valid untuk model dan jenis instans. Dalam tabel berikut, kami melaporkan throughput yang dicapai pada nilai permintaan bersamaan terbesar yang dicapai sebelum menghadapi batas waktu pemanggilan SageMaker untuk permintaan apa pun.

Throughput Maksimum (token/dtk), Permintaan Bersamaan
ID Model ml.g5.2xbesar ml.g5.12xbesar ml.g5.48xbesar ml.p4d.24xbesar ml.p4de.24xlarge
Lama 2 7B 486 (64) 1214 (128) 804 (128) 2945 (512) -
Lama 2 7B Obrolan 493 (64) 1207 (128) 932 (128) 3012 (512) -
Lama 2 13B - 787 (128) 496 (64) 3245 (512) -
Lama 2 13B Obrolan - 782 (128) 505 (64) 3310 (512) -
Lama 2 70B - - 124 (16) 1585 (256) -
Lama 2 70B Obrolan - - 114 (16) 1546 (256) -
Mistral 7B 947 (64) - - - -
Instruksi Mistral 7B 986 (128) - - - -
Campuran 8x7B - - 701 (128) 3196 (512) -
Elang 7B 1340 (128) - - - -
Instruksi Falcon 7B 1313 (128) - - - -
Elang 40B - 244 (32) 382 (64) 2699 (512) -
Instruksi Falcon 40B - 245 (32) 415 (64) 2675 (512) -
Elang 180B - - - - 1100 (128)
Obrolan Falcon 180B - - - - 1081 (128)

Untuk mencapai throughput maksimum suatu model, Anda dapat menggunakan kode berikut:

from sagemaker.jumpstart.model import JumpStartModel model = JumpStartModel( model_id="meta-textgeneration-llama-2-7b", model_version="3.*", instance_type="ml.g5.12xlarge", env={ "MAX_CONCURRENT_REQUESTS": "128", # For your application, identify it from the benchmarking table with the maximum feasible concurrent requests. "MAX_INPUT_TOKENS": "256", "MAX_TOTAL_TOKENS": "512", },
)
predictor = model.deploy(accept_eula=False) # Change EULA acceptance to True

Perhatikan bahwa jumlah maksimum permintaan serentak bergantung pada jenis model, jenis instans, jumlah maksimum token masukan, dan jumlah maksimum token keluaran. Oleh karena itu, Anda harus mengatur parameter ini sebelum mengaturnya MAX_CONCURRENT_REQUESTS.

Perhatikan juga bahwa pengguna yang tertarik untuk meminimalkan latensi sering kali berselisih dengan pengguna yang tertarik untuk memaksimalkan throughput. Yang pertama tertarik pada respons real-time, sedangkan yang kedua tertarik pada pemrosesan batch sehingga antrian titik akhir selalu jenuh, sehingga meminimalkan waktu henti pemrosesan. Pengguna yang ingin memaksimalkan throughput yang dikondisikan pada persyaratan latensi sering kali tertarik untuk beroperasi tepat pada kurva latensi-throughput.

Minimalkan biaya

Opsi pertama untuk meminimalkan biaya melibatkan meminimalkan biaya per jam. Dengan ini, Anda dapat menerapkan model yang dipilih pada instans SageMaker dengan biaya per jam terendah. Untuk harga instans SageMaker secara real-time, lihat Harga Amazon SageMaker. Secara umum, jenis instans default untuk SageMaker JumpStart LLM adalah opsi penerapan berbiaya terendah.

Opsi kedua untuk meminimalkan biaya melibatkan meminimalkan biaya untuk menghasilkan 1 juta token. Ini adalah transformasi sederhana dari tabel yang kita bahas sebelumnya untuk memaksimalkan throughput, di mana Anda dapat menghitung terlebih dahulu waktu yang diperlukan dalam jam untuk menghasilkan 1 juta token (1e6/throughput/3600). Anda kemudian dapat mengalikan waktu ini untuk menghasilkan 1 juta token dengan harga per jam dari instans SageMaker yang ditentukan.

Perhatikan bahwa instans dengan biaya per jam terendah tidak sama dengan instans dengan biaya terendah untuk menghasilkan 1 juta token. Misalnya, jika permintaan pemanggilan bersifat sporadis, instance dengan biaya per jam terendah mungkin merupakan pilihan optimal, sedangkan dalam skenario pembatasan, biaya terendah untuk menghasilkan satu juta token mungkin lebih tepat.

Pertukaran paralel tensor vs. multi-model

Dalam semua analisis sebelumnya, kami mempertimbangkan untuk menerapkan replika model tunggal dengan tingkat paralel tensor yang sama dengan jumlah GPU pada jenis instans penerapan. Ini adalah perilaku SageMaker JumpStart default. Namun, seperti disebutkan sebelumnya, sharding suatu model hanya dapat meningkatkan latensi dan throughput model hingga batas tertentu, di mana persyaratan komunikasi antar-perangkat akan mendominasi waktu komputasi. Hal ini menyiratkan bahwa sering kali bermanfaat untuk menerapkan beberapa model dengan derajat paralel tensor yang lebih rendah pada satu instance dibandingkan model tunggal dengan derajat paralel tensor yang lebih tinggi.

Di sini, kami menerapkan titik akhir Llama 2 7B dan 13B pada instance ml.p4d.24xlarge dengan derajat tensor parallel (TP) 1, 2, 4, dan 8. Untuk kejelasan dalam perilaku model, masing-masing titik akhir ini hanya memuat satu model.

. Throughput (token/dtk) Latensi (ms/token)
Permintaan Bersamaan 1 2 4 8 16 32 64 128 256 512 1 2 4 8 16 32 64 128 256 512
Gelar TP Lama 2 13B
1 38 74 147 278 443 612 683 722 - - 26 27 27 29 37 45 87 174 - -
2 49 92 183 351 604 985 1435 1686 1726 - 21 22 22 22 25 32 46 91 159 -
4 46 94 181 343 655 1073 1796 2408 2764 2819 23 21 21 24 25 30 37 57 111 172
8 44 86 158 311 552 1015 1654 2450 3087 3180 22 24 26 26 29 36 42 57 95 152
. Lama 2 7B
1 62 121 237 439 778 1122 1569 1773 1775 - 16 16 17 18 22 28 43 88 151 -
2 62 122 239 458 780 1328 1773 2440 2730 2811 16 16 17 18 21 25 38 56 103 182
4 60 106 211 420 781 1230 2206 3040 3489 3752 17 19 20 18 22 27 31 45 82 132
8 49 97 179 333 612 1081 1652 2292 2963 3004 22 20 24 26 27 33 41 65 108 167

Analisis kami sebelumnya telah menunjukkan keunggulan throughput yang signifikan pada instans ml.p4d.24xlarge, yang sering kali menghasilkan kinerja yang lebih baik dalam hal biaya untuk menghasilkan 1 juta token pada keluarga instans g5 dalam kondisi beban permintaan bersamaan yang tinggi. Analisis ini dengan jelas menunjukkan bahwa Anda harus mempertimbangkan trade-off antara model sharding dan replikasi model dalam satu contoh; artinya, model dengan sharding penuh biasanya bukan merupakan penggunaan terbaik sumber daya komputasi ml.p4d.24xlarge untuk kelompok model 7B dan 13B. Faktanya, untuk rangkaian model 7B, Anda mendapatkan throughput terbaik untuk replika model tunggal dengan tingkat paralel tensor 4, bukan 8.

Dari sini, Anda dapat memperkirakan bahwa konfigurasi throughput tertinggi untuk model 7B melibatkan derajat paralel tensor 1 dengan delapan replika model, dan konfigurasi throughput tertinggi untuk model 13B kemungkinan besar adalah derajat paralel tensor 2 dengan empat replika model. Untuk mempelajari lebih lanjut tentang cara mencapai hal ini, lihat Kurangi biaya penerapan model rata-rata sebesar 50% menggunakan fitur terbaru Amazon SageMaker, yang menunjukkan penggunaan titik akhir berbasis komponen inferensi. Karena teknik penyeimbangan beban, perutean server, dan berbagi sumber daya CPU, Anda mungkin tidak sepenuhnya mencapai peningkatan throughput yang persis sama dengan jumlah replika dikalikan throughput untuk satu replika.

Penskalaan horizontal

Seperti yang diamati sebelumnya, setiap penerapan titik akhir memiliki batasan jumlah permintaan bersamaan, bergantung pada jumlah token masukan dan keluaran serta jenis instans. Jika ini tidak memenuhi persyaratan throughput atau permintaan serentak, Anda dapat meningkatkan skala untuk memanfaatkan lebih dari satu instans di belakang titik akhir yang disebarkan. SageMaker secara otomatis melakukan penyeimbangan beban kueri antar instans. Misalnya, kode berikut menyebarkan titik akhir yang didukung oleh tiga instans:

model = JumpStartModel( model_id="meta-textgeneration-llama-2-7b", model_version="3.*", instance_type="ml.g5.2xlarge",
)
predictor = model.deploy( accept_eula=False, # Change EULA acceptance to True initial_instance_count = 3,
)

Tabel berikut menunjukkan perolehan throughput sebagai faktor jumlah instans untuk model Llama 2 7B.

. . Throughput (token/dtk) Latensi (ms/token)
. Permintaan Bersamaan 1 2 4 8 16 32 64 128 1 2 4 8 16 32 64 128
Hitungan Instance Jenis Mesin Virtual Jumlah total token: 512, Jumlah token keluaran: 256
1 ml.g5.2xbesar 30 60 115 210 351 484 492 - 32 33 34 37 45 93 160 -
2 ml.g5.2xbesar 30 60 115 221 400 642 922 949 32 33 34 37 42 53 94 167
3 ml.g5.2xbesar 30 60 118 228 421 731 1170 1400 32 33 34 36 39 47 57 110

Khususnya, titik pada kurva latensi-throughput bergeser ke kanan karena jumlah instans yang lebih tinggi dapat menangani permintaan bersamaan dalam jumlah yang lebih besar dalam titik akhir multi-instans. Untuk tabel ini, nilai permintaan serentak adalah untuk keseluruhan titik akhir, bukan jumlah permintaan serentak yang diterima setiap instans individual.

Anda juga dapat menggunakan penskalaan otomatis, sebuah fitur untuk memantau beban kerja Anda dan menyesuaikan kapasitas secara dinamis untuk mempertahankan performa yang stabil dan dapat diprediksi dengan biaya serendah mungkin. Ini di luar cakupan postingan ini. Untuk mempelajari lebih lanjut tentang penskalaan otomatis, lihat Mengonfigurasi titik akhir inferensi penskalaan otomatis di Amazon SageMaker.

Panggil titik akhir dengan permintaan bersamaan

Misalkan Anda memiliki sejumlah besar kueri yang ingin Anda gunakan untuk menghasilkan respons dari model yang diterapkan dalam kondisi throughput tinggi. Misalnya, dalam blok kode berikut, kami mengkompilasi daftar 1,000 payload, dengan setiap payload meminta pembuatan 100 token. Secara keseluruhan, kami meminta pembuatan 100,000 token.

payload = { "inputs": "I believe the meaning of life is to ", "parameters": {"max_new_tokens": 100, "details": True},
}
total_requests = 1000
payloads = [payload,] * total_requests

Saat mengirimkan permintaan dalam jumlah besar ke API runtime SageMaker, Anda mungkin mengalami kesalahan pembatasan. Untuk mengurangi hal ini, Anda dapat membuat klien runtime SageMaker khusus yang meningkatkan jumlah upaya percobaan ulang. Anda dapat memberikan objek sesi SageMaker yang dihasilkan ke JumpStartModel konstruktor atau sagemaker.predictor.retrieve_default jika Anda ingin melampirkan prediktor baru ke titik akhir yang sudah diterapkan. Dalam kode berikut, kami menggunakan objek sesi ini saat menerapkan model Llama 2 dengan konfigurasi default SageMaker JumpStart:

import boto3
from botocore.config import Config
from sagemaker.session import Session
from sagemaker.jumpstart.model import JumpStartModel sagemaker_session = Session( sagemaker_runtime_client=boto3.client( "sagemaker-runtime", config=Config(connect_timeout=10, retries={"mode": "standard", "total_max_attempts": 20}), )
)
model = JumpStartModel( model_id="meta-textgeneration-llama-2-7b", model_version="3.*", sagemaker_session=sagemaker_session
)
predictor = model.deploy(accept_eula=False) # Change EULA acceptance to True

Titik akhir yang diterapkan ini memiliki MAX_CONCURRENT_REQUESTS = 128 secara default. Di blok berikut, kami menggunakan pustaka masa depan bersamaan untuk mengulangi pemanggilan titik akhir untuk semua payload dengan 128 thread pekerja. Paling banyak, titik akhir akan memproses 128 permintaan secara bersamaan, dan setiap kali permintaan mengembalikan respons, pelaksana akan segera mengirimkan permintaan baru ke titik akhir.

import time
from concurrent import futures concurrent_requests = 128 time_start = time.time()
with futures.ThreadPoolExecutor(max_workers=concurrent_requests) as executor: responses = list(executor.map(predictor.predict, payloads)) total_tokens = sum([response[0]["details"]["generated_tokens"] for response in responses])
token_throughput = total_tokens / (time.time() - time_start)

Hal ini menghasilkan total 100,000 token dengan throughput 1255 token/dtk pada satu instans ml.g5.2xlarge. Ini membutuhkan waktu sekitar 80 detik untuk diproses.

Perhatikan bahwa nilai throughput ini sangat berbeda dari throughput maksimum untuk Llama 2 7B di ml.g5.2xlarge di tabel sebelumnya pada postingan ini (486 token/detik pada 64 permintaan bersamaan). Hal ini karena payload input menggunakan 8 token, bukan 256, jumlah token output adalah 100, bukan 256, dan jumlah token yang lebih kecil memungkinkan 128 permintaan bersamaan. Ini adalah pengingat terakhir bahwa semua angka latensi dan throughput bergantung pada payload! Mengubah jumlah token payload akan memengaruhi proses pengelompokan selama penyajian model, yang pada gilirannya akan memengaruhi waktu pengisian awal, dekode, dan antrean yang muncul untuk aplikasi Anda.

Kesimpulan

Dalam postingan ini, kami menyajikan benchmarking SageMaker JumpStart LLM, termasuk Llama 2, Mistral, dan Falcon. Kami juga menyajikan panduan untuk mengoptimalkan latensi, throughput, dan biaya untuk konfigurasi penerapan titik akhir Anda. Anda dapat memulai dengan menjalankan notebook terkait untuk membandingkan kasus penggunaan Anda.


Tentang Penulis

Tolok ukur dan optimalkan penerapan titik akhir di Amazon SageMaker JumpStart | Kecerdasan Data PlatoBlockchain Layanan Web Amazon. Pencarian Vertikal. Ai.  Dr.Kyle Ulrich adalah Ilmuwan Terapan di tim Amazon SageMaker JumpStart. Minat penelitiannya meliputi algoritma pembelajaran mesin yang dapat diskalakan, visi komputer, deret waktu, non-parametrik Bayesian, dan proses Gaussian. Gelar PhD-nya berasal dari Duke University dan dia telah menerbitkan makalah di NeurIPS, Cell, dan Neuron.

Tolok ukur dan optimalkan penerapan titik akhir di Amazon SageMaker JumpStart | Kecerdasan Data PlatoBlockchain Layanan Web Amazon. Pencarian Vertikal. Ai.Dr. Vivek Madan adalah Ilmuwan Terapan dengan tim JumpStart Amazon SageMaker. Dia mendapatkan gelar PhD dari University of Illinois di Urbana-Champaign dan merupakan Peneliti Pasca Doktoral di Georgia Tech. Dia adalah peneliti aktif dalam pembelajaran mesin dan desain algoritma dan telah menerbitkan makalah di konferensi EMNLP, ICLR, COLT, FOCS, dan SODA.

Tolok ukur dan optimalkan penerapan titik akhir di Amazon SageMaker JumpStart | Kecerdasan Data PlatoBlockchain Layanan Web Amazon. Pencarian Vertikal. Ai.Dr Ashish Khetan adalah Ilmuwan Terapan Senior di Amazon SageMaker JumpStart dan membantu mengembangkan algoritme pembelajaran mesin. Ia memperoleh gelar PhD dari University of Illinois Urbana-Champaign. Dia adalah peneliti aktif dalam pembelajaran mesin dan inferensi statistik, dan telah menerbitkan banyak makalah di konferensi NeurIPS, ICML, ICLR, JMLR, ACL, dan EMNLP.

Tolok ukur dan optimalkan penerapan titik akhir di Amazon SageMaker JumpStart | Kecerdasan Data PlatoBlockchain Layanan Web Amazon. Pencarian Vertikal. Ai.JoĆ£o Moura adalah Arsitek Solusi Spesialis AI/ML Senior di AWS. JoĆ£o membantu pelanggan AWS ā€“ mulai dari startup kecil hingga perusahaan besar ā€“ melatih dan menerapkan model besar secara efisien, dan secara lebih luas membangun platform ML di AWS.

Stempel Waktu:

Lebih dari Pembelajaran Mesin AWS