Helo semua, saya Tao Li daripada pasukan pakar pengkomputeran GPU NVIDIA. Saya sangat gembira kerana berpeluang berkongsi dengan anda hari ini apa yang telah saya dan rakan sekerja saya Chen Yu lakukan dalam Swin Transformer. model visual yang besar. Beberapa bekerja pada latihan jenis dan pengoptimuman inferens. Sesetengah kaedah dan strategi ini boleh digunakan dalam latihan model lain dan pengoptimuman inferens untuk meningkatkan daya pemprosesan model, meningkatkan kecekapan penggunaan GPU dan mempercepatkan lelaran model.
Saya akan memperkenalkan pengoptimuman bahagian latihan model Swin Transformer Kerja pada bahagian pengoptimuman inferens akan diperkenalkan secara terperinci oleh rakan sekerja saya
Berikut ialah direktori yang kami kongsikan hari ini, yang terbahagi terutamanya kepada empat bahagian Memandangkan ia dioptimumkan untuk model tertentu. terlebih dahulu saya akan memperkenalkan secara ringkas model Swin Transformer. Kemudian, saya akan menggabungkan alat pemprofilan, iaitu sistem pandangan, untuk menganalisis dan mengoptimumkan proses latihan. Dalam bahagian inferens, rakan sekerja saya akan memberikan strategi dan kaedah untuk pengoptimuman inferens, termasuk pengoptimuman peringkat CUDA yang lebih terperinci. Akhir sekali, berikut ialah ringkasan kandungan pengoptimuman hari ini.
Pertama ialah bahagian pertama iaitu pengenalan Swin Transformer.
1 Pengenalan kepada Swin Transformer
Seperti yang kita boleh lihat dari nama model, Ini adalah model berdasarkan transformer Mari kita semak secara ringkas transformer dahulu.
Selepas model Transformer dicadangkan dalam artikel perhatian adalah semua yang anda perlukan, ia telah menyinari banyak tugas dalam bidang pemprosesan bahasa semula jadi.
Inti model Transformer ialah mekanisme perhatian yang dipanggil, iaitu mekanisme perhatian. Untuk modul perhatian, input biasa ialah pertanyaan, kunci dan tensor nilai. Melalui fungsi pertanyaan dan kunci, ditambah dengan pengiraan softmax, hasil perhatian yang biasanya dipanggil peta perhatian boleh diperolehi Mengikut nilai dalam peta perhatian, model boleh mempelajari bidang mana yang perlu diberi perhatian lebih. atau Dikatakan bahawa model boleh mempelajari nilai-nilai yang mana dalam nilai yang sangat membantu untuk tugas kita. Ini adalah model perhatian satu kepala yang paling asas.
Dengan menambah bilangan modul perhatian satu kepala sedemikian, kami boleh membentuk modul perhatian berbilang kepala biasa. Pengekod dan penyahkod biasa dibina berdasarkan modul perhatian berbilang kepala tersebut.
Banyak model biasanya termasuk dua modul perhatian, perhatian diri dan perhatian silang, atau susunan satu atau lebih modul. Sebagai contoh, BERT yang terkenal terdiri daripada berbilang modul pengekod Model resapan popular biasanya merangkumi kedua-dua perhatian kendiri dan perhatian silang.
Sebelum Swin Transformer, Vision Transformer (ViT) terlebih dahulu menggunakan transformer dalam bidang penglihatan komputer. Struktur model ViT ditunjukkan di sebelah kiri rajah di bawah ViT akan membahagikan imej kepada satu siri tampalan. pengekod berasaskan , dan akhirnya mendapatkan ciri yang boleh digunakan untuk tugasan seperti pengelasan.
Datang ke Swin Transformer, ia memperkenalkan konsep window attention Tidak seperti ViT, yang memberi perhatian kepada keseluruhan imej, Swin Transformer akan membahagikan imej terlebih dahulu beberapa tetingkap, dan kemudian hanya memberi perhatian kepada tampalan di dalam tetingkap, dengan itu mengurangkan jumlah pengiraan.
Untuk mengimbangi masalah sempadan yang disebabkan oleh tingkap, Swin Transformer memperkenalkan lagi operasi peralihan tingkap. Pada masa yang sama, untuk menjadikan model mempunyai maklumat kedudukan yang lebih kaya, kecenderungan kedudukan relatif juga diperkenalkan dalam perhatian. Sebenarnya, window attention dan window shift di sini adalah asal usul nama Swin dalam Swin Transformer.
Diberikan di sini ialah struktur rangkaian Swin Transformer Struktur rangkaian kasar sangat serupa dengan CNN tradisional seperti ResNet serupa.
Anda boleh melihat bahawa keseluruhan struktur rangkaian dibahagikan kepada beberapa peringkat, dan di tengah-tengah peringkat yang berbeza, akan ada proses pensampelan turun yang sepadan. Resolusi setiap peringkat adalah berbeza, membentuk piramid resolusi, yang juga secara beransur-ansur mengurangkan kerumitan pengiraan setiap peringkat.
Kemudian akan ada beberapa blok transformer dalam setiap peringkat. Dalam setiap blok pengubah, modul perhatian tetingkap yang dinyatakan di atas akan digunakan.
Seterusnya, mari kita menyahbina Swin Transformer daripada perspektif operasi tertentu.
Seperti yang anda lihat, blok pengubah melibatkan tiga bahagian Bahagian pertama ialah operasi anjakan tingkap/sekatan/balikan yang berkaitan dengan tingkap, dan yang kedua bahagian ialah pengiraan perhatian, dan bahagian ketiga ialah pengiraan FFN; bahagian perhatian dan FFN boleh dibahagikan lagi kepada beberapa ops, dan akhirnya kita boleh membahagikan keseluruhan model kepada gabungan berpuluh-puluh ops.
Bahagian operator sebegini amat penting bagi kami untuk menjalankan analisis prestasi, mencari kesesakan prestasi dan menjalankan pengoptimuman pecutan.
Di atas adalah pengenalan kepada bahagian pertama. Seterusnya, mari kita perkenalkan beberapa kerja pengoptimuman yang telah kami lakukan dalam latihan Khususnya, kami menggabungkan alat pemprofilan, iaitu sistem pandangan, untuk menganalisis dan mengoptimumkan keseluruhan proses latihan.
2 pengoptimuman latihan Swin Transformer
Untuk besar. Untuk latihan model, sumber pengkomputeran berbilang kad dan berbilang nod biasanya digunakan. Untuk Swin Transformer, kami mendapati bahawa overhed komunikasi antara kad akan menjadi agak kecil Apabila bilangan kad meningkat, kelajuan keseluruhan meningkat hampir secara linear Jadi di sini, kami memberi keutamaan untuk menganalisis kesesakan pengkomputeran pada satu GPU pengoptimuman.
sistem pandangan ialah alat analisis prestasi peringkat sistem Melalui alat ini, kita boleh melihat penggunaan GPU bagi setiap modul model sama ada kemungkinan kesesakan prestasi dan ruang pengoptimuman seperti menunggu data boleh memudahkan kita untuk merancang beban antara CPU dan GPU secara munasabah.
sistem pandangan boleh menangkap status panggilan dan menjalankan fungsi kernel yang dipanggil oleh CUDA dan beberapa perpustakaan pengkomputeran gpu seperti cublas, cudnn, tensorRT, dll. Dan ia adalah mudah untuk pengguna menambah beberapa markah untuk mengira operasi gpu yang sepadan dalam julat markah.
Proses pengoptimuman model standard ditunjukkan dalam rajah di bawah Kami memprofilkan model, mendapatkan laporan analisis prestasi, menemui titik pengoptimuman prestasi, dan kemudian menyasarkannya untuk melakukan penalaan prestasi.
Berikut ialah antara muka sistem nsight Kita boleh melihat dengan jelas pelancaran fungsi kernel, iaitu pelancaran kernel, yang merupakan bahagian runtime di sini. Untuk fungsi kernel tertentu, kita boleh melihat perkadaran masa dalam keseluruhan proses, serta maklumat seperti sama ada GPU melahu. Selepas menambah tag nvtx, kita dapat melihat masa yang diperlukan untuk model bergerak ke hadapan dan berundur.
Di bahagian hadapan, jika kita zum masuk, kita juga boleh melihat dengan jelas keperluan pengiraan khusus setiap Blok SwinTransformer masa.
Kami mula-mula menggunakan alat analisis prestasi sistem pandangan untuk melihat prestasi keseluruhan garis dasar, seperti yang ditunjukkan dalam Rajah di bawah Daripada garis dasar FP32, kita dapat melihat bahawa penggunaan GPUnya adalah sangat tinggi, dan perkadaran tertinggi ialah kernel pendaraban matriks.
Jadi untuk pendaraban matriks, salah satu kaedah pengoptimuman kami ialah menggunakan sepenuhnya teras tensor untuk pecutan.
Kami tahu bahawa GPU NVIDIA mempunyai sumber perkakasan seperti teras cuda dan teras tensor ialah modul yang direka khusus untuk mempercepatkan pendaraban matriks. Kita boleh mempertimbangkan untuk menggunakan teras tensor tf32 secara langsung atau menggunakan teras tensor fp16 dalam ketepatan campuran. Anda harus tahu bahawa daya pemprosesan pendaraban matriks teras tensor menggunakan fp16 akan lebih tinggi daripada tf32, dan pendaraban matriks fp32 tulen juga akan mempunyai kesan pecutan yang tinggi.
Di sini, kami menggunakan penyelesaian ketepatan campuran. Dengan menggunakan mod ketepatan campuran torch.cuda.amp, kita boleh mencapai peningkatan daya pemprosesan sebanyak 1.63x.
Anda juga boleh melihat dengan jelas dalam hasil pemprofilan bahawa pendaraban matriks yang pada asalnya menyumbang nombor tertinggi telah dioptimumkan . , bahagian dalam keseluruhan garis masa menurun kepada 11.9%. Setakat ini, biji dengan perkadaran yang agak tinggi adalah bijirin mengikut unsur.
Untuk kernel mengikut elemen, pertama sekali kita perlu memahami di mana kernel mengikut elemen akan digunakan.
Inti mengikut unsur, kernel mengikut elemen yang lebih biasa dibuka dan kernel mengikut unsur vektor. Antaranya, kernel yang dibongkar mengikut elemen didapati secara meluas dalam beberapa lilitan berat sebelah atau lapisan linear, serta dalam beberapa operasi yang memastikan kesinambungan data dalam ingatan.
irung mengikut elemen bervektor sering muncul dalam pengiraan beberapa fungsi pengaktifan, seperti ReLU. Jika anda ingin mengurangkan bilangan inti mengikut unsur yang besar di sini, pendekatan yang biasa dilakukan ialah melakukan gabungan operator Contohnya, dalam pendaraban matriks, kita boleh mengurangkan bahagian overhed masa ini dengan menggabungkan operasi mengikut unsur dengan pengendali pendaraban matriks.
Untuk gabungan operator, secara amnya, ia boleh membawa kita dua faedah:
Salah satunya ialah mengurangkan kos pelancaran kernel Seperti yang ditunjukkan dalam rajah di bawah, pelaksanaan dua kernel cuda memerlukan dua pelancaran, yang mungkin menyebabkan jurang antara kernel dan menjadikan GPU terbiar. Jadi, jika kita menggabungkan dua biji cuda menjadi satu biji cuda, di satu pihak, kita menyimpan pelancaran, dan pada masa yang sama, kita boleh mengelakkan penjanaan jurang.
Faedah lain ialah ia mengurangkan akses memori global, kerana akses memori global sangat memakan masa, dan keputusan mesti dipindahkan antara dua biji cuda bebas melalui memori global , menggabungkan dua biji cuda menjadi satu kernel, kita boleh memindahkan keputusan dalam daftar atau memori yang dikongsi, dengan itu mengelakkan satu memori global menulis dan membaca dan meningkatkan prestasi.
Untuk gabungan operator, langkah pertama kami ialah menggunakan perpustakaan puncak siap sedia untuk melaksanakan operasi dalam Layernorm dan Adam Untuk gabungan, kita dapat melihat bahawa melalui penggantian arahan mudah, kita boleh mendayakan norma lapisan bercantum apex dan Adam bercantum, dengan itu meningkatkan pecutan daripada 1.63 kali kepada 2.11 kali.
Daripada log profling, kita juga boleh melihat bahawa selepas gabungan operator, kernel mengikut elemen menyumbang 10% daripada ini garis masa. Nisbah telah dikurangkan dengan banyaknya, dan pendaraban matriks sekali lagi menjadi inti yang menyumbang masa terbesar.
Selain menggunakan perpustakaan puncak sedia ada, kami juga membangunkan pengendali gabungan manual.
Dengan memerhati garis masa dan memahami model, kami mendapati bahawa terdapat operasi berkaitan tetingkap unik dalam Swin Transformer, seperti partition/shift/merge tetingkap, dll., di sini Anjakan tetingkap memerlukan memanggil dua kernel, dan kernel mengikut elemen dipanggil selepas anjakan selesai. Selain itu, jika operasi sedemikian perlu dilakukan sebelum modul perhatian, akan ada operasi terbalik yang sepadan selepas itu. Di sini, roll_cuda_kernel yang dipanggil oleh window shift sahaja menyumbang 4.6% daripada keseluruhan garis masa.
Operasi yang disebut tadi sebenarnya hanya membahagikan data, iaitu data yang sepadan akan dibahagikan kepada In a tetingkap, kod asal yang sepadan ditunjukkan dalam rajah di bawah.
Kami mendapati bahagian operasi ini sebenarnya hanyalah pemetaan indeks, jadi kami menyepadukan bahagian ini pembangunan Operator. Semasa proses pembangunan, kita perlu menguasai pengetahuan berkaitan pengaturcaraan CUDA dan menulis kod yang berkaitan untuk pengiraan hadapan dan pengiraan belakang pengendali.
Bagaimana untuk memperkenalkan pengendali tersuai ke dalam pytorch, tutorial rasmi diberikan, kita boleh mengikuti tutorial untuk menulis kod CUDA, dan ia boleh digunakan sebagai modul selepas penyusunan Perkenalkan model asal. Dapat dilihat bahawa dengan memperkenalkan pengendali gabungan tersuai kami, kami boleh meningkatkan lagi kelajuan kepada 2.19 kali.
Apa yang berikut ialah kerja gabungan kami di bahagian mha.
Bahagian Mha ialah modul besar dalam model pengubah, jadi mengoptimumkannya selalunya boleh menghasilkan kesan pecutan yang lebih besar. Seperti yang dapat dilihat daripada rajah, sebelum pelakuran operator dilakukan, perkadaran operasi di bahagian mha ialah 37.69%, yang merangkumi banyak kernel mengikut unsur. Jika kita boleh menggabungkan operasi berkaitan ke dalam kernel yang berasingan dengan kelajuan yang lebih pantas, kelajuan boleh dipertingkatkan lagi.
Untuk Swin Transformer, sebagai tambahan kepada pertanyaan, kunci dan nilai, topeng dan bias semuanya dihantar dalam bentuk tensor Kami telah membangunkan modul seperti fMHA, yang boleh menukar Beberapa kernel asal adalah bersepadu. Berdasarkan pengiraan yang terlibat dalam modul fMHA, modul ini telah meningkatkan dengan ketara beberapa bentuk yang ditemui dalam Swin Transformer.
Selepas menggunakan modul fMHA dalam model, kita boleh meningkatkan lagi kelajuan sebanyak 2. 85 kali ganda. Di atas ialah kesan pecutan latihan yang kami capai pada satu kad Mari kita lihat situasi latihan pada mesin tunggal dengan 8 kad. mencapai pecutan 2.32 kali.
Untuk pengoptimuman latihan, kami berharap lebih tinggi nisbah pecutan, lebih baik, kami juga berharap selepas itu pecutan Prestasi boleh kekal sama seperti sebelum pecutan.
Selepas menindih beberapa penyelesaian pecutan di atas, dapat dilihat bahawa penumpuan model adalah konsisten dengan garis dasar asal Penumpuan dan ketepatan model sebelum dan selepas pengoptimuman dipertingkatkan, terbukti pada Swin-Tiny, Swin-Base dan Swin-Large.
Mengenai bahagian latihan, beberapa strategi pecutan lain termasuk graf CUDA, berbilang aliran, dsb., yang boleh digunakan untuk Swin Transformer Prestasi telah dipertingkatkan lagi dalam aspek lain, kami sedang memperkenalkan penyelesaian ketepatan campuran, yang merupakan strategi yang digunakan oleh repo rasmi Swin Transformer menggunakan penyelesaian fp16 tulen (iaitu, mod puncak O2). mencapai pecutan yang lebih pantas.
Walaupun Swin tidak mempunyai keperluan komunikasi yang tinggi, untuk latihan model besar berbilang nod, berbanding dengan latihan teragih asal, strategi yang munasabah digunakan untuk Oleh menyembunyikan overhed komunikasi, faedah selanjutnya boleh diperolehi dalam latihan berbilang kad.
Seterusnya, saya ingin menjemput rakan sekerja saya untuk memperkenalkan penyelesaian dan kesan pecutan kami dalam inferens.
3. , saya Chen Yu daripada pasukan pakar pengkomputeran GPU NVIDIA Terima kasih banyak atas pengenalan Tao Li tentang pecutan latihan. Seterusnya, izinkan saya memperkenalkan pecutan pada inferens.
Sama seperti latihan, pecutan inferens tidak dapat dipisahkan daripada penyelesaian gabungan operator. Walau bagaimanapun, berbanding dengan latihan, gabungan operator mempunyai fleksibiliti yang lebih baik dalam inferens, yang ditunjukkan terutamanya dalam dua perkara:
Inferens Gabungan operator tidak memerlukan untuk mempertimbangkan arah songsang, jadi proses pembangunan kernel tidak perlu mempertimbangkan untuk menyimpan hasil perantaraan yang diperlukan untuk mengira kecerunan; kita boleh mengira beberapa operasi yang hanya memerlukan satu pengiraan dan boleh digunakan berulang kali, mengiranya terlebih dahulu, mengekalkan keputusan dan memanggilnya terus semasa setiap inferens untuk mengelakkan pengiraan berulang.
Pertama sekali, kami menyenaraikan pendaraban dan konvolusi matriks secara berasingan kerana terdapat kelas pelakuran operator yang besar di sekelilingnya Untuk pelakuran yang berkaitan dengan pendaraban matriks, kita boleh pertimbangkan untuk menggunakan cublas, cutlass, cudnn Ketiga-tiga ini perpustakaan; untuk konvolusi, kita boleh menggunakan cudnn atau cutlass. Jadi untuk pelakuran pengendali pendaraban matriks, dalam model Transformer, kami meringkaskannya sebagai operasi gemm + elemen, seperti gemm + bias, gemm + bias + fungsi pengaktifan, dll. Untuk gabungan operator jenis ini, kami boleh mempertimbangkan secara langsung Call cublas atau cutlass untuk mencapai ini.
Selain itu, jika operasi op selepas gemm kami lebih kompleks, seperti layernorm, transpose, dll., kami boleh mempertimbangkan untuk memisahkan gemm dan bias, dan kemudian menyepadukan bias ke Dalam op seterusnya, ini memudahkan untuk memanggil cublas untuk melaksanakan pendaraban matriks mudah Sudah tentu, corak penyepaduan bias ini dengan op seterusnya secara amnya memerlukan kita menulis inti cuda dengan tangan.
Akhir sekali, terdapat beberapa ops khusus yang juga memerlukan kami menggabungkannya dengan menulis kernel cuda, seperti layernorm + shift + window partition.
Memandangkan gabungan operator memerlukan kami untuk mereka bentuk isirong cuda dengan lebih mahir, kami secara amnya mengesyorkan menganalisis saluran paip keseluruhan melalui alat analisis prestasi sistem pandangan, memberi keutamaan kepada The modul hotspot melaksanakan pengoptimuman gabungan operator untuk mencapai keseimbangan antara prestasi dan beban kerja.
Kemudian antara banyak pengoptimuman gabungan operator, kami memilih dua operator dengan kesan pecutan yang jelas.
Pertama ialah gabungan operator bahagian mha Kami memajukan operasi carian bias kedudukan ke bahagian prapemprosesan untuk mengelak daripada melakukan carian setiap kali kami membuat kesimpulan.
Kemudian kami menggabungkan kumpulan gemm, softmax dan kumpulan gemm ke dalam kernel fMHA bebas Pada masa yang sama, kami menyepadukan operasi yang berkaitan dengan fMHA I/. O operasi , corak bacaan dan penulisan data tertentu digunakan untuk mengelakkan operasi transpos yang jelas.
Seperti yang anda lihat, selepas gabungan, bahagian ini telah mencapai pecutan 10x, dan pecutan hujung ke hujung juga 1.58x.
Satu lagi gabungan operator yang saya ingin perkenalkan ialah gabungan QKV gemm + bias.
Gabungan gemm dan bias adalah kaedah gabungan yang sangat biasa untuk bekerjasama dengan kernel fMHA yang kami nyatakan sebelum ini, kami perlu menyesuaikan berat dan berat sebelah terlebih dahulu. Buat perubahan format.
Sebab saya memilih untuk memperkenalkan gabungan operator ini adalah tepat kerana transformasi pendahuluan ini merangkumi pengiraan inferensi yang kami nyatakan sebelum ini -penyatuan, kita boleh membuat beberapa perubahan pada proses inferens model yang tidak menjejaskan ketepatannya, dengan itu mencapai corak gabungan operator yang lebih baik dan mencapai kesan pecutan yang lebih baik.
Akhir sekali, melalui penyepaduan QKV gemm+bias, kita boleh terus mencapai pecutan hujung ke hujung sebanyak 1.1 kali.
Kaedah pengoptimuman seterusnya ialah padding darab matriks.
Dalam pengiraan Swin Transformer, kadangkala kita menghadapi pendaraban matriks dengan dimensi utama yang ganjil Pada masa ini, adalah tidak kondusif untuk kernel pendaraban matriks kita melakukan pembacaan dan penulisan vektor, lantas menjadikan kernel Kecekapan operasi menjadi rendah Pada masa ini, kita boleh mempertimbangkan untuk mengalas dimensi utama matriks yang mengambil bahagian dalam operasi untuk menjadikannya gandaan 8. Dengan cara ini, kernel pendaraban matriks boleh membaca dan menulis 8 elemen pada satu masa. dengan penjajaran=8 Kaedah untuk melakukan pembacaan dan penulisan vektor untuk meningkatkan prestasi.
Seperti yang ditunjukkan dalam jadual di bawah, selepas kita mengalas n daripada 49 kepada 56, kependaman pendaraban matriks menurun daripada 60.54us kepada 40.38us, mencapai 1.5 kali ganda Nisbah kelajuan.
Kaedah pengoptimuman seterusnya ialah menggunakan jenis data seperti half2 atau char4.
Kod berikut ialah contoh pengoptimuman half2. Ia melaksanakan operasi gabungan operator mudah untuk menambah berat sebelah dan baki , berbanding kelas separuh data, kita boleh mengurangkan kependaman daripada 20.96us kepada 10.78us, pecutan sebanyak 1.94 kali.
Jadi apakah faedah umum menggunakan jenis data half2? Terdapat tiga perkara utama:
Faedah pertama ialah pembacaan dan penulisan bervektor boleh meningkatkan kecekapan penggunaan lebar jalur memori dan mengurangkan bilangan arahan akses memori seperti yang ditunjukkan di sebelah kanan rajah di bawah menunjukkan bahawa melalui penggunaan half2, arahan capaian memori dikurangkan separuh, dan SOL memori juga dipertingkatkan dengan ketara; Faedah kedua ialah menggabungkan arahan matematik high-throughput proprietari separuh2 boleh mengurangkan kependaman kernel. Kedua-dua perkara ini telah dicerminkan dalam program sampel ini;
Faedah ketiga ialah apabila membangunkan kernel berkaitan pengurangan, menggunakan jenis data half2 bermaksud Satu CUDA benang memproses dua elemen pada masa yang sama, yang boleh mengurangkan bilangan benang terbiar dengan berkesan dan mengurangkan kependaman penyegerakan benang.
Kaedah pengoptimuman seterusnya ialah menggunakan tatasusunan daftar dengan bijak.
Apabila kami mengoptimumkan pengendali biasa model Transformer seperti layernorm atau softmax, kami selalunya perlu menggunakan data input yang sama beberapa kali dalam kernel, kemudian Daripada membaca dari memori global setiap kali, kita boleh menggunakan tatasusunan daftar untuk cache data untuk mengelakkan pembacaan berulang memori global.
Memandangkan daftar adalah eksklusif untuk setiap utas cuda, apabila mereka bentuk kernel, kita perlu menetapkan elemen yang setiap utas cuda perlu cache terlebih dahulu , dengan itu membuka tatasusunan daftar saiz yang sepadan, dan apabila memperuntukkan elemen yang bertanggungjawab untuk setiap utas cuda, kita perlu memastikan bahawa kita boleh mencapai akses gabungan, seperti yang ditunjukkan di sebelah kanan atas rajah di bawah, apabila kita mempunyai 8 utas , thread No. 0 Ia boleh memproses elemen No. 0. Apabila kita mempunyai 4 thread, thread No. 0 memproses elemen No. 0 dan No. 4, dan seterusnya.
Kami biasanya mengesyorkan menggunakan fungsi templat untuk mengawal saiz tatasusunan daftar setiap utas CUDA melalui parameter templat.
Selain itu, apabila menggunakan tatasusunan daftar, kita perlu memastikan bahawa subskrip kita adalah pemalar, jika ia adalah Pembolehubah gelung digunakan sebagai subskrip Kita harus berusaha sebaik mungkin untuk memastikan pengembangan gelung dapat dilakukan Ini boleh menghalang pengkompil daripada meletakkan data dalam memori tempatan dengan kependaman yang tinggi kepada keadaan gelung, yang boleh dilihat melalui laporan ncu, mengelakkan penggunaan memori tempatan.
Kaedah pengoptimuman terakhir yang saya ingin perkenalkan ialah kuantisasi INT8.
Kuantasi INT8 ialah kaedah pecutan yang sangat penting untuk pecutan inferens Untuk model berasaskan Transformer, kuantisasi INT8 boleh mengurangkan penggunaan memori dan membawa hasil yang lebih baik.
Untuk Swin, dengan menggabungkan skim pengkuantitian PTQ atau QAT yang sesuai, anda boleh mencapai pecutan yang baik sambil memastikan ketepatan pengkuantitian. Secara amnya, kami melakukan pengkuantitian int8, terutamanya untuk mengkuantiskan pendaraban atau konvolusi matriks Contohnya, dalam pendaraban matriks int8, kami akan terlebih dahulu mengkuantisasi input dan pemberat FP32 atau FP16 ke dalam INT8 dan kemudian melakukan pendaraban matriks INT8 dan terkumpul kepada Jenis data INT32 -bijaksana, di sinilah kita akan melakukan operasi pengkuantitian songsang dan mendapatkan hasil FP32 atau FP16.
Alat yang lebih biasa untuk memanggil pendaraban matriks INT8 ialah cublasLt. Untuk mencapai prestasi yang lebih baik, kita perlu pergi lebih mendalam Mari kita lihat dengan lebih dekat beberapa ciri cublasLt api.
cublasLt menyediakan dua jenis output untuk pendaraban matriks int8, seperti yang ditunjukkan di sebelah kiri rajah di bawah, output dalam INT32, atau seperti yang ditunjukkan di sebelah kanan daripada rajah di bawah Paparan, keluaran dalam INT8, operasi pengiraan cublasLt ditunjukkan dalam kotak biru dalam rajah.
Anda boleh lihat bahawa berbanding dengan output INT32, output INT8 akan mempunyai pasangan tambahan operasi pengkuantaan songsang dan pengkuantitian, yang secara amnya akan membawa lebih banyak Terdapat kerugian ketepatan, tetapi kerana output INT8 mempunyai volum data 3/4 kurang daripada output INT32 apabila menulis ke memori global, prestasi akan menjadi lebih baik, jadi terdapat pertukaran antara ketepatan dan prestasi.
Jadi untuk Swin Transformer, kami mendapati bahawa dengan QAT, output INT8 akan memastikan ketepatan di bawah premis untuk mencapai nisbah pecutan yang baik, kerana kami menggunakan skema output INT8 .
Selain itu, mengenai pendaraban matriks INT8 dalam cublasLt, anda juga perlu mempertimbangkan susun atur data. cublasLt menyokong dua Terdapat satu susun atur, susun atur khusus IMMA, yang melibatkan beberapa format yang lebih kompleks, dan hanya menyokong NT-permata dalam susun atur ini susun atur .
Secara umumnya, menggunakan susun atur lajur pertama akan lebih kondusif untuk pembangunan keseluruhan kod saluran paip, kerana jika kita menggunakan reka letak khusus IMMA, kita mungkin perlu serasi dengan ini susun atur Banyak operasi tambahan, serta kernel huluan dan hiliran, juga perlu serasi dengan susun atur khas ini. Walau bagaimanapun, reka letak khusus IMMA mungkin mempunyai prestasi yang lebih baik pada pendaraban matriks beberapa saiz, jadi jika kita ingin cuba membina penaakulan int8, adalah disyorkan agar kita melakukan beberapa penanda aras terlebih dahulu untuk lebih memahami prestasi dan kemudahan pembangunan .
Dalam FasterTransformer kami menggunakan reka letak khusus IMMA. Jadi seterusnya, kami mengambil reka letak khusus IMMA sebagai contoh untuk memperkenalkan secara ringkas proses pembinaan asas pendaraban matriks cublasLt int8, serta beberapa teknik pembangunan.
cublasLt int8 Proses pembinaan asas pendaraban matriks boleh dibahagikan kepada 5 langkah:
Pertama sekali, khusus IMMA susun atur adalah khusus kepada keperluan saiz matriks, untuk mengelakkan keperluan peruntukan ruang tambahan semasa proses inferens, kami akan memperuntukkan penimbal yang mematuhi saiz susun atur khusus IMMA terlebih dahulu; 🎜>
Kemudian, Memandangkan berat boleh diproses dan digunakan semula sekali, kami akan mengubah susun atur berat (bersamaan dengan matriks B dalam pendaraban) terlebih dahulu untuk mengelakkan perubahan berat berulang semasa proses inferens;Apa yang ditunjukkan di sini ialah ketepatan pengkuantitian Swin Transformer int8 melalui QAT kita dapat memastikan kehilangan ketepatannya dalam seperseribu Dalam 5.
Dalam lajur PTQ, kita dapat melihat bahawa penurunan mata Swin-Large secara amnya, kita boleh mempertimbangkan untuk menggunakannya jika ia sepadan dengan serius masalah kejatuhan titik.
Dalam FT, kami boleh melumpuhkan pengkuantitian songsang sebelum keluaran int8 bagi pendaraban matriks int 8 dalam FC2 dan PatchMerge serta nod pengkuantitian (iaitu, menggunakan output int32) untuk meningkatkan lagi ketepatan pengkuantitian Dapat dilihat bahawa di bawah operasi pengoptimuman ini, ketepatan PTQ swin-large juga telah dipertingkatkan dengan ketara.
Berikut ialah kesan pecutan yang kami capai pada bahagian inferens Kami menggunakan model GPU T4, A10, yang berbeza. dan A100 Perbandingan prestasi dengan pelaksanaan pytorch FP16 telah dilakukan di atas. Bahagian kiri rajah di bawah menunjukkan perbandingan kependaman antara pengoptimuman dan pytorch, dan angka kanan menunjukkan nisbah pecutan antara FP16 dan pytorch selepas pengoptimuman, dan nisbah kelajuan antara pengoptimuman INT8 dan pengoptimuman FP16 . Ia boleh dilihat bahawa melalui pengoptimuman, kita boleh mencapai pecutan 2.82x ~ 7.34x berbanding pytorch dari segi ketepatan FP16 Digabungkan dengan kuantisasi INT8, kita boleh terus mencapai pecutan 1.2x ~ 1.5x berdasarkan ini. 4 ringkasan pengoptimuman Swin Transformer Akhirnya, mari kita ringkaskan dalam perkongsian ini, kami memperkenalkan cara mencari kesesakan prestasi melalui alat analisis prestasi sistem nsight, dan kemudian memperkenalkan satu siri teknik pecutan inferens latihan untuk kesesakan prestasi, termasuk 1. Ketepatan Hibrid. latihan/penaakulan ketepatan rendah, 2. Gabungan operator, 3. teknik pengoptimuman isirong cuda: seperti padding sifar matriks, pembacaan dan penulisan bervektor, penggunaan tatasusunan daftar dengan bijak, dll. 4. Beberapa prapemprosesan digunakan dalam pengoptimuman inferens untuk menambah baik kami Proses pengiraan; kami juga memperkenalkan beberapa aplikasi graf berbilang aliran dan cuda. Digabungkan dengan pengoptimuman di atas, kami menggunakan model Swin-Large sebagai contoh untuk mencapai nisbah pecutan 2.85x untuk satu kad dan 2.32x untuk nisbah 8-kad; dari segi penaakulan, dengan mengambil model Swin-kecil sebagai contoh, ia mencapai nisbah pecutan 2.82x ~ 7.34x di bawah ketepatan FP16, ia seterusnya mencapai nisbah pecutan 1.2x ~ 1.5x. Kaedah pecutan di atas untuk latihan model visual besar dan inferens telah dilaksanakan dalam AIAK platform pengkomputeran heterogen AI Baidu Baige Dilaksanakan dalam fungsi pecutan, semua orang dialu-alukan untuk menggunakannya.
Atas ialah kandungan terperinci Bagaimana untuk menggunakan model visual yang besar untuk mempercepatkan latihan dan inferens?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!