Rumah > Artikel > Peranti teknologi > Amalan latihan sistem pengesyoran berskala besar WeChat berdasarkan PyTorch
Artikel ini akan memperkenalkan latihan sistem pengesyoran berskala besar WeChat berdasarkan PyTorch. Tidak seperti beberapa bidang pembelajaran mendalam yang lain, sistem pengesyoran masih menggunakan Tensorflow sebagai rangka kerja latihan, yang dikritik oleh majoriti pembangun. Walaupun terdapat beberapa amalan menggunakan PyTorch untuk latihan pengesyoran, skalanya kecil dan tiada pengesahan perniagaan sebenar, menjadikannya sukar untuk mempromosikan pengguna awal perniagaan.
Pada Februari 2022, pasukan PyTorch telah melancarkan perpustakaan rasmi yang disyorkan TorchRec. Pasukan kami mula mencuba TorchRec dalam perniagaan dalaman pada bulan Mei dan melancarkan satu siri kerjasama dengan pasukan TorchRec. Selama beberapa bulan penggunaan percubaan, kami telah mengalami banyak kelebihan TorchRec, dan kami juga merasakan bahawa TorchRec masih mempunyai beberapa kelemahan dalam model berskala sangat besar. Sebagai tindak balas kepada kekurangan ini, kami mereka bentuk fungsi lanjutan untuk mengisi masalahnya. Pada September 2022, pembenaman dinamik fungsi lanjutan yang kami reka telah disepadukan secara rasmi ke dalam cawangan utama TorchRec, dan masih dioptimumkan secara berterusan dengan pasukan rasmi.
Mari kita bincangkan dahulu tentang apa yang boleh dibawa oleh TorchRec kepada kita? Kita semua tahu bahawa sistem pengesyoran selalunya dikaitkan secara langsung dengan aliran tunai syarikat, dan kos percubaan dan kesilapan adalah sangat tinggi, jadi apa yang semua orang perlukan ialah rangka kerja yang telah diuji oleh perniagaan. Inilah sebabnya mengapa beberapa rangka kerja pengesyoran sebelumnya berdasarkan PyTorch tidak digunakan secara meluas. Sebagai rangka kerja cadangan rasmi, TorchRec telah dilancarkan pada Januari 2022. Meta telah menggunakannya untuk berjaya melatih dan melancarkan model parameter 125 bilion pada perniagaan Instagram Reels, menjadi rangka kerja PyTorch yang diuji perniagaan. Dengan sokongan perniagaan besar seperti Instagram, kami lebih yakin dan akhirnya boleh mempertimbangkan secara rasional kelebihan rangka kerja pengesyoran berdasarkan PyTorch.
TorchRec mempunyai faedah yang berbeza untuk ahli pasukan yang berbeza. Pertama sekali, bagi sebahagian besar jurutera algoritma dalam pasukan, rangka kerja yang disyorkan PyTorch membolehkan semua orang akhirnya menikmati grafik dinamik yang lebih mesra pengguna dan pengalaman penyahpepijatan yang dialami oleh jurutera CV dan NLP.
Selain itu, PyTorch mempunyai keserasian yang sangat baik - model berdasarkan PyTorch1.8 boleh dijalankan pada versi 1.13 terbaharu tanpa menukar baris kod ——Membenarkan jurutera algoritma akhirnya menaik taraf rangka kerja dengan yakin, dengan itu menikmati fungsi rangka kerja terkini dan prestasi yang lebih baik. Sebaliknya, beberapa rangka kerja yang disyorkan berdasarkan TensorFlow sering terperangkap pada versi TensorFlow tertentu. Contohnya, banyak pasukan mungkin masih menggunakan rangka kerja dalaman berdasarkan TensorFlow 1.x. TensorFlow 1.x telah menghentikan penyelenggaraan pada Januari 2021, yang bermaksud bahawa dalam dua tahun yang lalu, semua pepijat baharu dan ciri baharu tidak akan disokong dengan baik. Masalah yang dihadapi semasa penggunaan hanya boleh dibaiki oleh pasukan penyelenggaraan dalaman, yang menambah kos tambahan. Peningkatan rangka kerja yang tepat pada masanya juga boleh membawa peningkatan kelajuan percuma versi PyTorch yang lebih tinggi selalunya sepadan dengan versi CUDA yang lebih tinggi, serta beberapa ciri baharu seperti graf CUDA, yang boleh meningkatkan lagi kelajuan latihan dan meningkatkan kecekapan latihan.
Selain jurutera algoritma, pasukan rangka kerja juga merupakan bahagian penting dalam pasukan pengesyoran. Pasukan rangka kerja dalam syarikat akan menjalankan pembangunan sekunder berdasarkan keperluan dalaman selepas memilih rangka kerja sumber terbuka. Bagi mereka, rangka kerja yang disyorkan untuk PyTorch akan membawa kepada pengalaman pembangunan yang lebih diperkemas. Banyak rangka kerja tradisional yang disyorkan TensorFlow akan meniru siaran TF untuk membuat sambungan berdasarkan sesi C++ - penyelesaian reka bentuk ini dianggap sebagai penyelesaian yang sangat maju pada masa itu - tetapi ini memerlukan kompilasi lengkap keseluruhan TensorFlow hanya untuk menukar satu baris kod, yang memakan masa Ia sangat panjang, malah ia perlu menyelesaikan masalah remeh seperti memuat turun kebergantungan luaran pada intranet, dan pengalaman pembangunan tidak begitu baik.
Anda tidak akan menghadapi masalah sebegitu apabila menggunakan PyTorch, kerana PyTorch adalah berdasarkan falsafah Python dan ia berharap semua orang dapat melanjutkannya dengan bebas. Apabila kita melakukan pembangunan sekunder, kita hanya perlu merangkumnya dengan perpustakaan Python yang agak matang seperti pybind11, membungkus perpustakaan kita ke dalam perpustakaan pautan dinamik, dan kemudian ia boleh dimuatkan. Dengan cara ini, kelajuan kompilasi keseluruhan secara semula jadi akan menjadi lebih pantas, dan kos pembelajaran akan jauh lebih rendah.
Seperti yang dinyatakan sebelum ini, PyTorch ialah rangka kerja dengan keserasian ke belakang yang sangat baik, yang membolehkan pasukan penyelenggaraan mengelak daripada mengekalkan berbilang versi jika kita boleh mendapatkan penyelesaian rasmi, semua orang boleh memberi tumpuan kepada keperluan khusus, dan kecekapan pasukan akan dipertingkatkan dengan ketara.
Di atas adalah semua kelebihan TorchRec sebagai rangka kerja pengesyoran PyTorch Apa yang menggembirakan kami ialah pasukan TorchRec tidak berhenti membuat pengesyoran PyTorch rangka kerja. Mereka memerhatikan ciri-ciri model dan perkakasan pengesyoran sedia ada, dan menambahkan banyak ciri baharu pada rangka kerja, memberikan TorchRec kelebihan prestasi yang jelas berbanding rangka kerja pengesyoran tradisional. Seterusnya, saya akan memilih beberapa daripada mereka untuk diperkenalkan, iaitu pembenaman GPU, kernel GPU yang sangat baik dalam TorchRec, dan bahagian pembenaman yang boleh dilakukan oleh TorchRec berdasarkan komunikasi rangkaian.
Pertama ialah pembenaman GPU. Mari kita semak dahulu proses latihan GPU sistem pengesyoran tradisional Kami akan meletakkan model khusus pada pekerja GPU, dan pembenaman akan disimpan pada PS jauh. Setiap langkah lelaran akan mula-mula menarik parameter dari PS jauh, kemudian melakukan pengiraan ke hadapan dan belakang model pada GPU, memindahkan kecerunan kembali ke PS dan mengemas kini parameter pada PS.
Bahagian hijau dalam gambar ialah operasi yang dilakukan pada GPU, dan bahagian merah dilakukan pada rangkaian atau CPU. Dapat dilihat bahawa walaupun GPU adalah bahagian paling mahal dalam sistem, banyak operasi tidak diletakkan pada GPU.
Proses tradisional tidak menggunakan GPU sepenuhnya. Pada masa yang sama, dari perspektif perkakasan, memori kad GPU tunggal menjadi lebih besar dan lebih besar, dan beberapa model padat jauh daripada menggunakan sepenuhnya GPU Dengan pengoptimuman berterusan NVIDIA, pautan NV dan RDMA terus GPU juga telah menjadi antara -komunikasi kad lebih pantas dan pantas .
Pembenaman GPU ialah penyelesaian yang sangat mudah. Dia membahagikan pembenaman secara langsung dan meletakkannya pada GPU - contohnya, jika terdapat 8 kad pada satu mesin, kami terus membahagikan pembenaman kepada 8 bahagian dan meletakkan setiap bahagian pada kad - dengan itu memastikan semua operasi kekal pada kad . Kecekapan penggunaan GPU akan dipertingkatkan dengan ketara, dan kelajuan latihan juga akan dipertingkatkan secara kualitatif. Jika anda bimbang tentang ruang memori video yang tidak mencukupi pada GPU, TorchRec juga menyokong UVM, yang boleh membahagikan sebahagian daripada memori pada hos terlebih dahulu sebagai tambahan kepada memori video, sekali gus meningkatkan saiz benam yang boleh diletakkan di dalam mesin tunggal.
Selain pembenaman GPU, TorchRec juga melaksanakan kernel GPU yang sangat baik. Inti ini memanfaatkan sepenuhnya ciri perkakasan terkini dan ciri CUDA.
Sebagai contoh, jika anda ingin melaksanakan kernel carian pembenaman, anda perlu mencari sekumpulan pembenaman yang sepadan dengan ID daripada pembenaman besar. vektor, kemudian dalam pelaksanaan biasa, setiap urutan GPU akan diberikan ID dan biarkan mereka mencari pembenaman yang sepadan masing-masing. Pada masa ini, kita perlu mempertimbangkan bahawa lapisan bawah GPU dijadualkan mengikut warp, dan 32 benang dalam warp akan membaca dan menulis memori video bersama-sama. Ini bermakna bahawa dalam proses di atas, walaupun memori video diakses secara berterusan apabila membaca ID, salinan seterusnya menjadi keadaan baca dan tulis rawak. Untuk perkakasan, pembacaan dan penulisan rawak tidak dapat menggunakan lebar jalur memori sepenuhnya, dan kecekapan pengendalian tidak cukup tinggi.
TorchRec menggunakan primitif meledingkan seperti shuffle_sync untuk menyiarkan ID ke Pada semua utas dalam meledingkan, 32 utas dalam balut boleh memproses pembenaman yang sama pada masa yang sama, supaya pembacaan dan penulisan memori berterusan dapat dilakukan, yang meningkatkan kecekapan penggunaan lebar jalur memori video dengan ketara dan meningkatkan kelajuan kernel beberapa kali .
Jadual ini ialah ujian rasmi untuk membenamkan peningkatan prestasi carian. Di sini Fused EBC ialah kernel yang dioptimumkan. Ia boleh dilihat bahawa di bawah tetapan yang berbeza, TorchRec mempunyai berpuluh-puluh kali peningkatan prestasi berbanding dengan PyTorch asli. Berdasarkan TorchRec, kami mendapati bahawa apabila benam adalah agak kecil (kurang daripada 128), separuh atau lebih benang mungkin melahu, jadi kami mengumpulkan lagi benang dalam warp dan membiarkannya memproses berbilang benam pada masa yang sama.
Dengan penambahbaikan kami, penyematan kecil Inti pada malap telah ditambah baik sebanyak 10% hingga 30%. Pengoptimuman ini juga telah dimasukkan ke dalam repo rasmi. Perlu diingatkan bahawa kernel TorchRec diletakkan di perpustakaan FBGEMM. Rakan-rakan yang berminat boleh lihat.
Akhir sekali, saya ingin memperkenalkan mekanisme pembahagian pembenaman TorchRec. Seperti yang dinyatakan sebelum ini, pembenaman GPU adalah untuk membahagikan benam dan meletakkannya pada kad, jadi bagaimana untuk membahagikannya menjadi persoalan yang perlu dipertimbangkan. Secara tradisinya, terdapat dua idea bahagian, Bijak Baris dan Bijak Lajur. Dari segi baris bermakna jika terdapat 20,000 ciri, nombor 0 hingga 10000 diletakkan pada kad 1, dan nombor 10000 hingga 20000 diletakkan pada kad 2. Dengan cara ini, apabila kita berlatih, jika ID sepadan dengan kad 1, kita akan mula dari Ambilnya dari kad 1, dan jika sepadan dengan kad 2, ambil dari kad 2. Masalah dari segi Row ialah kerana kita tidak tahu sama ada terdapat jurang yang besar antara volum trafik 10,000 nombor pertama dan 10,000 nombor terakhir, komunikasi tidak seimbang dan perkakasan rangkaian tidak dapat digunakan sepenuhnya.
Bijaksana lajur dibahagikan daripada perspektif panjang benam. Sebagai contoh, jumlah panjang benam ialah 128. 64 dimensi pertama dan 64 dimensi terakhir boleh diletakkan pada kedudukan yang berbeza dengan cara ini komunikasi akan menjadi lebih seimbang, tetapi apabila membaca, ia perlu berkomunikasi dengan semua kad atau PS .
Perbezaan dalam mod pembahagian membawa pertukaran dalam pemilihan. Rangka kerja pengesyoran tradisional akan membetulkan kaedah pembahagian pembenaman dalam reka bentuk, manakala TorchRec menyokong pelbagai kaedah pembahagian - seperti mengikut baris, mengikut lajur, malah dari segi jadual, selari data - dan secara dalaman menyediakan seperti Perancang, Penganggar, PerfModel dan modul lain boleh secara automatik kira kaedah pembahagian berdasarkan lebar jalur, memori video, memori, saiz model dan parameter lain senario penggunaan. Dengan cara ini, pembenaman boleh dibahagikan dengan paling cekap mengikut keadaan perkakasan sebenar kami dan perkakasan boleh digunakan dengan paling cekap. Kebanyakan fungsi ini dilaksanakan dalam Python. Ini membolehkan kami menyesuaikannya untuk persekitaran dalaman kami dan dengan mudah membina sistem pengesyoran yang paling sesuai untuk persekitaran dalaman kami.
Dalam eksperimen kami, untuk model standard seperti DeepFM dan DCN, TorchRec mempunyai peningkatan prestasi 10 hingga 15 kali ganda yang menakjubkan berbanding rangka kerja pengesyoran garis dasar sebelumnya. Mendapatkan keuntungan prestasi sedemikian memberikan kami keyakinan untuk melancarkan TorchRec ke dalam perniagaan.
Untuk model susunan halus bacaan WeChat, berdasarkan ketepatan penjajaran, kami mendapati bahawa pada data sebenar Terdapat peningkatan prestasi kira-kira 3 kali, malah peningkatan kira-kira 10 kali ganda pada data palsu. Perbezaan di sini ialah membaca data untuk latihan telah menjadi hambatan, dan kami masih membuat pengoptimuman lanjut dalam hal ini.
03
Pelan asal bernilai 100 bilion dan banyak lagi Kekurangan dalam model besar
Model yang diperkenalkan sebelum ini pada asasnya adalah model dengan berpuluh bilion atau kurang, iaitu Model yang boleh dimuatkan dalam satu mesin. Semasa menolak TorchRec kepada model yang lebih besar, kami melihat beberapa isu dengan reka bentuk asli TorchRec. Untuk model besar, penyelesaian pembenaman GPU tulen TorchRec memerlukan lebih banyak kad - mungkin kelajuan latihan asal 8 kad boleh menyerap semua data, tetapi kami perlu menggunakan 16 kad untuk meletakkan pembenaman, yang menyukarkan untuk menambah baik perkakasan GPU kecekapan penggunaan telah diseret ke bawah semula.
Dan untuk senario model besar, pasukan algoritma sering mengemukakan keperluan untuk penambahan dinamik dan pemadaman pembenaman, seperti memadamkan ID yang belum diakses untuk seminggu. Penyelesaian TorchRec tidak menyokong ciri sedemikian. Di samping itu, perniagaan model yang sangat besar biasanya melibatkan banyak pasukan, dan memindahkan rangka kerja asas akan menghadapi rintangan yang hebat. Apa yang kami perlukan ialah sokongan untuk penghijrahan secara beransur-ansur dan beransur-ansur, dan kami tidak boleh membiarkan semua orang meletakkan kerja yang ada. Itu akan menjadi terlalu mahal dan berisiko.
Berdasarkan keperluan di atas, kami mempertimbangkan cara mengubah suai TorchRec supaya ia boleh menyesuaikan diri dengan senario yang sangat besar -model berskala. Kami percaya bahawa dalam latihan berskala ultra-besar, masih perlu untuk menyokong sambungan PS jauh, kerana CPU PS jauh sangat matang dan boleh menyokong penambahan dinamik pembenaman dengan mudah. Pada masa yang sama, untuk kerjasama merentas pasukan, PS boleh digunakan untuk mengasingkan latihan dan inferens untuk mencapai penghijrahan secara beransur-ansur.
Kemudian soalan seterusnya ialah bagaimana untuk memperkenalkan PS. Jika PS disambungkan terus kepada pembenaman GPU, setiap langkah lelaran masih perlu mengakses PS jauh, yang akan meningkatkan perkadaran keseluruhan rangkaian dan operasi CPU, dan penggunaan GPU akan dikurangkan lagi.
04
Cara pembenaman dinamik pasukan WeChat menyelesaikan masalah
Pada masa ini kami mendapati bahawa ID baharu dalam data setiap unit masa sebenarnya hanya menyumbang sebahagian kecil daripada jumlah data, HugeCTR menerbitkan makalah Kesimpulan yang sama juga disebut: hanya sebahagian kecil ID akan diakses dengan kerap. Daripada ini, kami terfikir untuk menggunakan pembenaman GPU untuk latihan seperti biasa, dan kemudian mengeluarkan ID ke PS secara berkelompok apabila memori paparan penuh.
Menurut idea ini, jika pembenaman GPU hanya boleh menyimpan n ID, dan jumlah bilangan ID ialah N satu, atau bahkan banyak yang tidak terhingga. ID global boleh dipetakan kepada 0, 1, 2, 3... mengikut tertib dan perhubungan pemetaan disimpan dalam struktur yang dipanggil transformasi ID, membenarkan pembenaman GPU menggunakan hasil pemetaan untuk latihan biasa. Apabila pembenaman GPU penuh, iaitu, apabila terdapat n pasang pemetaan dalam pengubah ID, ID diusir ke PS secara berkelompok.
Di bawah reka bentuk ini, ia boleh menjadi PS jarang campur tangan, pekerja GPU dan komunikasi PS hanya diperlukan semasa pengusiran.
Selain itu, dalam reka bentuk sedemikian, PS hanya perlu digunakan sebagai KV dan tidak perlu untuk menyokong kemas kini parameter , tidak perlu melaksanakan operasi berkaitan pengoptimum, membenarkan pasukan PS menumpukan pada kerja berkaitan storan. Kami juga menyokong pemalam yang melaksanakan sebarang storan KV, dan versi sumber terbuka mempunyai pemalam Redis terbina dalam, supaya Redis juga boleh digunakan sebagai PS.
Berikut ialah beberapa butiran reka bentuk dalam pembenaman dinamik. Transformer ID paling mudah dan paling asas yang kami laksanakan sebenarnya menggunakan jadual cincang, menggunakan ska::flat_hash_map berprestasi tinggi dalam PyTorch.
Sebagai satu-satunya operasi CPU dalam proses, ID Transformer mungkin mempunyai keperluan prestasi yang agak tinggi, jadi Kami turut melaksanakan versi berprestasi tinggi, yang disimpan dalam unit cacheline L1 untuk meningkatkan lagi kecekapan capaian memori.
Selain itu, untuk skim pengusiran, kami berharap dapat melaksanakan skim pengusiran dengan cekap tanpa meningkatkan ingatan tekanan cache. Gabungan LRU dan LFU. Diilhamkan oleh penyelesaian LFU Redis, kami mereka bentuk algoritma kebarangkalian: hanya indeks kekerapan akses ID disimpan. Sebagai contoh, jika diakses 32 kali, 5 disimpan. Apabila mengemas kini kekerapan, jika ID diakses semula, nombor rawak 5 digit akan dijana Jika semua 5 digit adalah 0, iaitu peristiwa dengan kebarangkalian 1/32 telah berlaku, kita akan meningkatkan indeks kekerapan. ke 6. Melalui algoritma kebarangkalian sedemikian, frekuensi LRU dan LFU boleh dimasukkan ke dalam uint32, menyepadukan LRU dan LFU tanpa meningkatkan tekanan capaian memori.
Akhir sekali, mari kita perkenalkan secara ringkas penyelesaian berbilang kad kami. Pada masa ini kami mengumpulkan semua data kad ke Pengubah ID kad satu, dan kemudian menyiarkannya kembali. Oleh kerana ID Transformer yang kami laksanakan mempunyai prestasi yang sangat tinggi dan boleh digabungkan dengan saluran paip pengkomputeran GPU, ia tidak akan menjadi hambatan prestasi tertentu.
Di atas ialah beberapa idea reka bentuk untuk pembenaman dinamik. Dalam perniagaan peringkat trilion dalaman kami, dalam hal ketepatan penjajaran, penyelesaian pembenaman dinamik mempunyai kira-kira 3 kali peningkatan prestasi berbanding rangka kerja Tensorflow GPU dalaman kami yang asal. Berbanding dengan versi TF yang dioptimumkan, ia masih mempunyai lebih daripada 50% kelebihan prestasi.
Akhir sekali, saya mengesyorkan semua orang mencuba Torchrec. Untuk perniagaan yang agak kecil, seperti berpuluh bilion perniagaan, adalah disyorkan agar anda menggunakan TorchRec asli secara terus: pasang dan main, tiada pembangunan sekunder diperlukan dan prestasi boleh digandakan. Untuk perniagaan yang sangat besar, kami mengesyorkan agar anda cuba menyepadukan pembenaman dinamik TorchRec dalam satu pihak, ia adalah mudah untuk menyambung ke PS dalaman, sebaliknya, ia juga menyokong pengembangan dan penghijrahan secara beransur-ansur, dan. pada masa yang sama, anda masih boleh mendapat peningkatan prestasi tertentu.
Berikut ialah beberapa model ketepatan dan senario aplikasi sedia ada yang telah kami selaraskan, untuk mereka yang berminat Rakan boleh mencubanya.
Atas ialah kandungan terperinci Amalan latihan sistem pengesyoran berskala besar WeChat berdasarkan PyTorch. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!