Dengan kelahiran komputer moden, masalah bagaimana untuk menyusun kod yang lebih cepat dan lebih kecil muncul.
Pengoptimuman kompilasi ialah kaedah pengoptimuman dengan nisbah kos-faedah tertinggi Pengoptimuman kod yang lebih baik boleh mengurangkan kos operasi aplikasi pusat data yang besar. Saiz kod terkumpul adalah penting untuk sistem mudah alih dan terbenam atau perisian yang digunakan pada partition but selamat, kerana binari yang disusun mesti memenuhi belanjawan saiz kod yang ketat. Apabila bidang semakin maju, heuristik yang semakin kompleks menghimpit ruang sistem yang terhad, menghalang penyelenggaraan dan penambahbaikan selanjutnya.
Penyelidikan terkini menunjukkan bahawa pembelajaran mesin boleh membuka lebih banyak peluang dalam pengoptimuman pengkompil dengan menggantikan heuristik kompleks dengan strategi pembelajaran mesin. Walau bagaimanapun, penggunaan strategi pembelajaran mesin dalam tujuan umum, penyusun gred industri kekal sebagai cabaran.
Untuk menyelesaikan masalah ini, dua jurutera kanan di Google, Qian Yundi dan Mircea Trofin, mencadangkan "MLGO, rangka kerja pengoptimuman pengkompil berpandukan pembelajaran mesin", yang merupakan industri pertama Rangka kerja universal untuk menyepadukan teknik pembelajaran mesin secara sistematik ke dalam LLVM, infrastruktur penyusun industri sumber terbuka yang ada di mana-mana dalam membina perisian berprestasi tinggi yang kritikal misi.
Alamat kertas: https://arxiv.org/pdf/2101.04808.pdf
MLGO menggunakan pembelajaran pengukuhan untuk melatih rangkaian saraf untuk membuat keputusan, menggantikan algoritma heuristik dalam LLVM. Menurut penerangan pengarang, terdapat dua pengoptimuman MLGO pada LLVM:
1) Kurangkan jumlah kod melalui sebaris
2) Melalui peruntukan daftar Meningkatkan prestasi kod.
Kedua-dua pengoptimuman tersedia dalam repositori LLVM dan telah digunakan dalam pengeluaran.
Sebaris membantu mengurangkan saiz kod dengan membuat keputusan yang mengalih keluar kod berlebihan. Dalam contoh di bawah, fungsi pemanggil <code style="font-family: monospace; font-size: 12px; background-color: rgba(0, 0, 0, 0.06); padding: 0px 2px; border-radius: 6px; line-height: inherit; overflow-wrap: break-word; text-indent: 0px;"><span style="font-size: 15px;">foo()</span>
foo() dipanggil atau berfungsi <span style="font-size: 15px;">bar()</span>
<span style="font-size: 15px;">bar()</span>
<span style="font-size: 15px;">bar()</span>
, dan
bar()<span style="font-size: 15px;">baz()</span>
sendiri memanggil <span style="font-size: 15px;">foo()</span>
baz(). Sebaris dua tapak panggilan ini akan mengembalikan
<p style="text-align: center;">foo()<img src="https://img.php.cn/upload/article/000/000/164/168291834816871.png" alt="内存减少3%-7%!谷歌提出用于编译器优化的机器学习框架 MLGO"></p>
fungsi yang akan mengurangkan saiz kod. Kapsyen: Sebaris mengurangkan saiz kod dengan mengalih keluar kod berlebihan
Dalam kod sebenar, terdapat beribu-ribu fungsi yang memanggil satu sama lain, sekali gus membentuk graf panggilan. Semasa fasa sebaris, pengkompil merentasi graf panggilan semua pasangan pemanggil-pemanggil dan memutuskan sama ada untuk sebaris pasangan pemanggil-pemanggil. Ini adalah proses membuat keputusan yang berterusan, kerana keputusan sebaris sebelumnya akan mengubah graf panggilan, mempengaruhi keputusan seterusnya dan keputusan akhir. Dalam contoh di atas, graf panggilan<code style="font-family: monospace; font-size: 12px; background-color: rgba(0, 0, 0, 0.06); padding: 0px 2px; border-radius: 6px; line-height: inherit; overflow-wrap: break-word; text-indent: 0px;"><span style="font-size: 15px;">foo()</span>
foo() → <span style="font-size: 15px;">bar()</span>
<span style="font-size: 15px;">bar()</span>
<span style="font-size: 15px;">baz()</span>
→
baz()
Memerlukan keputusan "ya" pada kedua-dua belah pihak untuk mengecilkan saiz kod.
Sebelum MLGO, keputusan sebaris/bukan sebaris telah dibuat oleh heuristik yang menjadi semakin sukar untuk diperbaiki dari semasa ke semasa. MLGO menggantikan heuristik dengan model pembelajaran mesin. Semasa merentasi graf panggilan, pengkompil mencari cadangan rangkaian saraf sama ada untuk menyelaraskan pasangan pemanggil-pemanggil tertentu melalui ciri yang berkaitan (iaitu, input) dalam graf input, dan melaksanakan keputusan secara berurutan sehingga keseluruhan graf Sehingga graf panggilan dicapai.
Ilustrasi: Ilustrasi MLGO semasa proses inlining, "#bbs", "#users" dan "callsite height" ialah contoh ciri pasangan pemanggil-pemanggil
MLGO menggunakan kecerunan dasar dan algoritma dasar evolusi untuk latihan RL bagi rangkaian keputusan. Walaupun tiada kebenaran asas tentang keputusan yang optimum, RL dalam talian menggunakan dasar terlatih yang berulang antara latihan dan pemasangan yang dijalankan untuk mengumpul data dan menambah baik dasar. Khususnya, memandangkan model yang sedang dalam latihan, pengkompil merujuk model semasa fasa sebaris untuk membuat keputusan sebaris/bukan sebaris. Selepas penyusunan, ia menghasilkan log proses keputusan berurutan (status, tindakan, ganjaran). Log ini kemudiannya diserahkan kepada jurulatih untuk mengemas kini model. Proses ini diulang sehingga model yang memuaskan diperolehi.
Nota gambar: Tingkah laku pengkompil semasa latihan
- pengkompil menyusun kod sumber foo.cpp ke dalam objek fail foo.o, dan melakukan satu siri pengoptimuman, salah satunya ialah saluran sebaris.
Dasar terlatih dibenamkan ke dalam pengkompil, memberikan keputusan sebaris/bukan sebaris semasa proses penyusunan. Tidak seperti senario latihan, strategi ini tidak menghasilkan log. Model TensorFlow dibenamkan dalam XLA AOT, yang menukar model kepada kod boleh laku. Ini mengelakkan kebergantungan dan overhed masa jalan TensorFlow, meminimumkan masa tambahan dan kos memori yang diperkenalkan oleh inferens model ML pada masa penyusunan.
Kapsyen: Tingkah laku pengkompil dalam persekitaran pengeluaran
Kami Saiz sebaris strategi telah dilatih pada pakej dalaman yang besar yang mengandungi 30k modul. Strategi terlatih boleh digeneralisasikan apabila menyusun perisian lain, dan
mengurangkan masa dan overhed memori sebanyak 3% ~ 7%. Selain keluasan merentas perisian, keluasan merentas masa juga penting, kedua-dua perisian dan pengkompil sedang dalam pembangunan aktif, jadi strategi yang terlatih diperlukan untuk mengekalkan prestasi yang baik dalam jumlah masa yang munasabah. Kami menilai prestasi model pada set perisian yang sama selepas tiga bulan dan mendapati hanya sedikit kemerosotan.Carta: Peratusan pengurangan saiz dasar saiz sebaris, paksi-x mewakili perisian yang berbeza, paksi-y mewakili pengurangan peratusan. "Latihan" ialah perisian yang melatih model dan "InfraX" ialah pakej perisian dalaman yang berbeza.
Latihan ubah saiz sebaris MLGO telah digunakan pada Fuchsia, sistem pengendalian sumber terbuka umum yang direka untuk menggerakkan ekosistem perkakasan dan perisian yang berbeza, Di mana saiz binari adalah kunci. Di sini, MLGO menunjukkan pengurangan 6.3% dalam saiz unit terjemahan C++.
Sebagai rangka kerja umum, kami menggunakan MLGO untuk menambah baik saluran peruntukan daftar (Register allocation) untuk meningkatkan prestasi kod dalam LLVM. Peruntukan daftar menyelesaikan masalah memperuntukkan daftar fizikal kepada skop aktif (iaitu pembolehubah).
Apabila kod dilaksanakan, julat langsung yang berbeza diselesaikan pada masa yang berbeza, mengeluarkan daftar untuk peringkat pemprosesan seterusnya. Dalam contoh berikut, setiap arahan "tambah" dan "darab" memerlukan semua operan dan keputusan berada dalam daftar fizikal. Julat masa nyata x diberikan kepada daftar hijau dan dilengkapkan sebelum julat masa nyata daftar biru atau kuning. Selepas x selesai, daftar hijau tersedia dan ditetapkan kepada julat langsung t.
Semasa pelaksanaan kod, julat langsung yang berbeza diselesaikan pada masa yang berbeza dan daftar dikeluarkan untuk digunakan dalam peringkat pemprosesan seterusnya. Dalam contoh di bawah, setiap arahan "tambah" dan "darab" memerlukan semua operan dan keputusan berada dalam daftar fizikal. Julat aktif x diberikan kepada daftar hijau dan lengkap sebelum julat langsung daftar biru atau kuning. Selepas x selesai, daftar hijau menjadi tersedia dan diberikan kepada julat langsung t .
Ilustrasi: Contoh peruntukan daftar
Apabila memperuntukkan julat aktif q Apabila , tiada daftar tersedia, jadi saluran peruntukan daftar mesti memutuskan julat aktif mana yang boleh "diusir" daripada daftarnya untuk memberi ruang kepada q. Ini dipanggil masalah "pengusiran lapangan", dan di sinilah kami melatih model untuk menggantikan keputusan heuristik asal. Dalam contoh ini, ia mengusir z daripada daftar kuning dan menetapkannya kepada q dan separuh pertama z.
Kami kini mempertimbangkan separuh bawah yang tidak diperuntukkan daripada julat sebenar z. Kami mempunyai satu lagi konflik, kali ini julat aktif t diusir dan berpecah, separuh pertama t dan bahagian terakhir z berakhir menggunakan daftar hijau. Bahagian tengah Z sepadan dengan arahan q = t * y, di mana z tidak digunakan, jadi ia tidak diperuntukkan kepada mana-mana daftar, dan nilainya disimpan dalam timbunan dari daftar kuning dan kemudian dimuatkan semula ke dalam daftar hijau . Perkara yang sama berlaku dengan t. Ini menambah arahan muatan/simpan tambahan pada kod, mengurangkan prestasi. Matlamat algoritma peruntukan daftar adalah untuk meminimumkan ketidakcekapan ini. Ini digunakan sebagai ganjaran untuk membimbing latihan dasar RL.
Sama seperti strategi saiz sebaris, strategi peruntukan daftar (regalloc-for-Performance) telah dilatih pada pakej perisian yang besar dalam Google dan boleh digeneralisasikan merentas perisian yang berbeza sesaat (QPS) bertambah baik sebanyak 0.3% ~ 1.5% pada set aplikasi pusat data besar dalaman. Penambahbaikan dalam QPS berterusan selama beberapa bulan selepas penggunaan, menunjukkan kebolehgeneralisasian model.
MLGO menggunakan pembelajaran tetulang untuk melatih rangkaian saraf untuk membuat keputusan Ia merupakan strategi pembelajaran mesin yang menggantikan kaedah heuristik yang kompleks. Sebagai rangka kerja gred perindustrian am ia akan lebih mendalam dan digunakan secara meluas dalam lebih banyak persekitaran daripada sekadar menyelaraskan dan mendaftarkan peruntukan.
MLGO boleh dibangunkan kepada: 1) lebih mendalam, seperti menambah lebih banyak ciri dan menggunakan algoritma RL yang lebih baik; 2) lebih luas, boleh digunakan untuk menyelaraskan dan pengagihan semula Lebih banyak heuristik pengoptimuman di luar.
Pengarang bersemangat tentang kemungkinan yang boleh dibawa oleh MLGO ke bidang pengoptimuman pengkompil dan mengharapkan penggunaan selanjutnya dan sumbangan masa depan daripada komuniti penyelidikan.
Atas ialah kandungan terperinci Pengurangan memori sebanyak 3%-7%! Google mencadangkan rangka kerja pembelajaran mesin MLGO untuk pengoptimuman pengkompil. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!