🚀 Coba Zilliz Cloud, Milvus yang sepenuhnya terkelola, secara gratis—rasakan performa 10x lebih cepat! Coba Sekarang>>

milvus-logo
LFAI
  • Home
  • Blog
  • Mempercepat Kompilasi 2.5X dengan Pemisahan Ketergantungan & Kontainerisasi Pengujian

Mempercepat Kompilasi 2.5X dengan Pemisahan Ketergantungan & Kontainerisasi Pengujian

  • Engineering
May 28, 2021
Zhifeng Zhang

Waktu kompilasi dapat diperparah dengan ketergantungan internal dan eksternal yang kompleks yang berkembang selama proses pengembangan, serta perubahan lingkungan kompilasi seperti sistem operasi atau arsitektur perangkat keras. Berikut ini adalah masalah umum yang mungkin ditemui saat mengerjakan proyek AI atau MLOps berskala besar:

Kompilasi yang sangat lama - Integrasi kode dilakukan ratusan kali setiap hari. Dengan ratusan ribu baris kode yang ada, bahkan perubahan kecil pun dapat menghasilkan kompilasi penuh yang biasanya memakan waktu satu jam atau lebih.

Lingkungan kompilasi yang kompleks - Kode proyek perlu dikompilasi di bawah lingkungan yang berbeda, yang melibatkan sistem operasi yang berbeda, seperti CentOS dan Ubuntu, ketergantungan yang mendasarinya, seperti GCC, LLVM, dan CUDA, dan arsitektur perangkat keras. Dan kompilasi di bawah lingkungan tertentu biasanya tidak dapat bekerja di lingkungan yang berbeda.

Ketergantungan yang kompleks - Kompilasi proyek melibatkan lebih dari 30 ketergantungan antar-komponen dan pihak ketiga. Pengembangan proyek sering kali menyebabkan perubahan pada ketergantungan, yang pasti menyebabkan konflik ketergantungan. Kontrol versi antara dependensi sangat kompleks sehingga memperbarui versi dependensi akan dengan mudah mempengaruhi komponen lain.

Pengunduhandependensi pihak ketiga lambat atau gagal - Penundaan jaringan atau pustaka dependensi pihak ketiga yang tidak stabil menyebabkan pengunduhan sumber daya yang lambat atau kegagalan akses, yang secara serius mempengaruhi integrasi kode.

Dengan memisahkan ketergantungan dan menerapkan kontainerisasi pengujian, kami berhasil mengurangi waktu kompilasi rata-rata sebesar 60% saat mengerjakan proyek pencarian kesamaan embedding sumber terbuka Milvus.


Memisahkan ketergantungan proyek

Kompilasi proyek biasanya melibatkan sejumlah besar ketergantungan komponen internal dan eksternal. Semakin banyak ketergantungan yang dimiliki sebuah proyek, semakin rumit untuk mengelolanya. Seiring dengan pertumbuhan perangkat lunak, akan semakin sulit dan mahal untuk mengubah atau menghapus ketergantungan, serta mengidentifikasi efek dari hal tersebut. Pemeliharaan rutin diperlukan selama proses pengembangan untuk memastikan dependensi berfungsi dengan baik. Pemeliharaan yang buruk, dependensi yang kompleks, atau dependensi yang salah dapat menyebabkan konflik yang memperlambat atau menghentikan pengembangan. Dalam praktiknya, hal ini dapat berarti pengunduhan sumber daya yang lambat, kegagalan akses yang berdampak negatif pada integrasi kode, dan banyak lagi. Memisahkan dependensi proyek dapat mengurangi cacat dan mengurangi waktu kompilasi, mempercepat pengujian sistem, dan menghindari hambatan yang tidak perlu pada pengembangan perangkat lunak.

Oleh karena itu, kami merekomendasikan untuk memisahkan ketergantungan proyek Anda:

  • Pisahkan komponen dengan ketergantungan yang kompleks
  • Gunakan repositori yang berbeda untuk manajemen versi.
  • Gunakan file konfigurasi untuk mengelola informasi versi, opsi kompilasi, ketergantungan, dll.
  • Tambahkan file konfigurasi ke pustaka komponen sehingga mereka diperbarui saat proyek beriterasi.

Kompilasioptimasi antar komponen - Tarik dan kompilasi komponen yang relevan sesuai dengan ketergantungan dan opsi kompilasi yang dicatat dalam file konfigurasi. Tandai dan kemas hasil kompilasi biner dan berkas manifes yang sesuai, lalu unggah ke repositori pribadi Anda. Jika tidak ada perubahan yang dilakukan pada komponen atau komponen yang bergantung padanya, mainkan hasil kompilasi sesuai dengan file manifes. Untuk masalah seperti penundaan jaringan atau pustaka ketergantungan pihak ketiga yang tidak stabil, coba siapkan repositori internal atau gunakan repositori cermin.

Untuk mengoptimalkan kompilasi antar komponen:

1. Buat grafik hubungan ketergantungan - Gunakan file konfigurasi di pustaka komponen untuk membuat grafik hubungan ketergantungan. Gunakan hubungan ketergantungan untuk mengambil informasi versi (Cabang Git, Tag, dan ID komit Git) dan opsi kompilasi serta lebih banyak lagi dari komponen yang bergantung pada hulu dan hilir.

1.png 1.png

2. Periksa ketergantungan - Menghasilkan peringatan untuk ketergantungan melingkar, konflik versi, dan masalah lain yang muncul di antara komponen.

3. Ratakan depend ensi - Urutkan dependensi berdasarkan Depth First Search (DFS) dan gabungkan komponen dengan dependensi duplikat untuk membentuk grafik dependensi.

2.png 2.png

4. Gunakan algoritma MerkleTree untuk menghasilkan hash (Root Hash) yang berisi dependensi setiap komponen berdasarkan informasi versi, opsi kompilasi, dan banyak lagi. Dikombinasikan dengan informasi seperti nama komponen, algoritme ini membentuk tag unik untuk setiap komponen.

3.png 3.png

5. Berdasarkan informasi tag unik komponen, periksa apakah arsip kompilasi yang sesuai ada di repo pribadi. Jika arsip kompilasi diambil, unzip untuk mendapatkan berkas manifes untuk pemutaran; jika tidak, kompilasi komponen, tandai berkas objek kompilasi dan berkas manifes yang dihasilkan, lalu unggah ke repo pribadi.


Menerapkan pengoptimalan kompilasi di dalam komponen - Pilih alat cache kompilasi khusus bahasa untuk menyimpan file objek yang dikompilasi, lalu unggah dan simpan di repositori pribadi Anda. Untuk kompilasi C/C++, pilih alat cache kompilasi seperti CCache untuk menyimpan cache file perantara kompilasi C/C++, dan kemudian mengarsipkan cache CCache lokal setelah kompilasi. Alat cache kompilasi semacam itu hanya menyimpan file kode yang diubah satu per satu setelah kompilasi, dan menyalin komponen yang dikompilasi dari file kode yang tidak berubah sehingga mereka dapat langsung terlibat dalam kompilasi akhir. Optimalisasi kompilasi dalam komponen mencakup langkah-langkah berikut:

  1. Tambahkan dependensi kompilasi yang diperlukan ke Dockerfile. Gunakan Hadolint untuk melakukan pemeriksaan kepatuhan pada Dockerfile untuk memastikan bahwa citra sesuai dengan praktik terbaik Docker.
  2. Cerminkan lingkungan kompilasi sesuai dengan versi sprint proyek (versi + build), sistem operasi, dan informasi lainnya.
  3. Jalankan kontainer lingkungan kompilasi yang dicerminkan, dan transfer ID citra ke kontainer sebagai variabel lingkungan. Berikut ini contoh perintah untuk mendapatkan ID citra: "docker inspect ' - type=image' - format '{{.ID}}' repository/build-env:v0.1-centos7".
  4. Pilih alat cache kompilasi yang sesuai: Masukkan penampung Anda untuk mengintegrasikan dan mengkompilasi kode-kode Anda dan periksa di repositori pribadi Anda apakah cache kompilasi yang sesuai tersedia. Jika ya, unduh dan ekstrak ke direktori yang ditentukan. Setelah semua komponen dikompilasi, cache yang dihasilkan oleh alat compile cache akan dikemas dan diunggah ke repositori pribadi Anda berdasarkan versi proyek dan ID gambar.


Pengoptimalan kompilasi lebih lanjut

Pada awalnya, kompilasi yang kami buat menghabiskan terlalu banyak ruang disk dan bandwidth jaringan, serta membutuhkan waktu yang lama untuk digunakan, sehingga kami mengambil langkah-langkah berikut ini:

  1. Pilih gambar dasar yang paling ramping untuk mengurangi ukuran gambar, misalnya alpine, busybox, dll.
  2. Kurangi jumlah lapisan gambar. Gunakan kembali dependensi sebanyak mungkin. Gabungkan beberapa perintah dengan "&&".
  3. Bersihkan produk antara selama pembuatan gambar.
  4. Gunakan cache gambar untuk membangun gambar sebanyak mungkin.

Saat proyek kami terus berjalan, penggunaan disk dan sumber daya jaringan mulai melonjak seiring bertambahnya cache kompilasi, sementara beberapa cache kompilasi kurang dimanfaatkan. Kami kemudian melakukan penyesuaian berikut ini:

Bersihkanfile cache secara teratur - Periksa repositori pribadi secara teratur (menggunakan skrip misalnya), dan bersihkan file cache yang tidak berubah selama beberapa saat atau tidak banyak diunduh.

Tembolokkompilasi secara selektif - Hanya tembolok kompilasi yang membutuhkan sumber daya, dan lewati tembolok kompilasi yang tidak membutuhkan banyak sumber daya.


Memanfaatkan pengujian dalam kontainer untuk mengurangi kesalahan, meningkatkan stabilitas dan keandalan

Kode harus dikompilasi di lingkungan yang berbeda, yang melibatkan berbagai sistem operasi (misalnya CentOS dan Ubuntu), ketergantungan yang mendasari (misalnya GCC, LLVM, dan CUDA), dan arsitektur perangkat keras tertentu. Kode yang berhasil dikompilasi di lingkungan tertentu akan gagal di lingkungan yang berbeda. Dengan menjalankan pengujian di dalam kontainer, proses pengujian menjadi lebih cepat dan akurat.

Kontainerisasi memastikan bahwa lingkungan pengujian konsisten, dan aplikasi bekerja seperti yang diharapkan. Pendekatan pengujian dalam kontainer mengemas pengujian sebagai kontainer gambar dan membangun lingkungan pengujian yang benar-benar terisolasi. Penguji kami menemukan bahwa pendekatan ini sangat berguna, yang pada akhirnya mengurangi waktu kompilasi sebanyak 60%.

Memastikan lingkungan kompilasi yang konsisten - Karena produk yang dikompilasi sensitif terhadap perubahan lingkungan sistem, kesalahan yang tidak diketahui dapat terjadi pada sistem operasi yang berbeda. Kami harus menandai dan mengarsipkan cache produk yang dikompilasi sesuai dengan perubahan lingkungan kompilasi, tetapi sulit untuk dikategorikan. Jadi kami memperkenalkan teknologi kontainerisasi untuk menyatukan lingkungan kompilasi untuk menyelesaikan masalah tersebut.


Kesimpulan

Dengan menganalisis ketergantungan proyek, artikel ini memperkenalkan berbagai metode untuk pengoptimalan kompilasi di antara dan di dalam komponen, memberikan ide dan praktik terbaik untuk membangun integrasi kode berkelanjutan yang stabil dan efisien. Metode-metode ini membantu mengatasi integrasi kode yang lambat yang disebabkan oleh ketergantungan yang kompleks, menyatukan operasi di dalam kontainer untuk memastikan konsistensi lingkungan, dan meningkatkan efisiensi kompilasi melalui pemutaran hasil kompilasi dan penggunaan alat cache kompilasi untuk menyimpan hasil kompilasi antara.

Praktik-praktik yang disebutkan di atas telah mengurangi waktu kompilasi proyek sebesar rata-rata 60%, sehingga meningkatkan efisiensi integrasi kode secara keseluruhan. Ke depannya, kami akan terus memparalelkan kompilasi antara dan di dalam komponen untuk mengurangi waktu kompilasi lebih lanjut.


Sumber-sumber berikut digunakan untuk artikel ini:


Tentang penulis

Zhifeng Zhang adalah insinyur senior DevOps di Zilliz.com yang bekerja di Milvus, database vektor sumber terbuka, dan instruktur resmi universitas perangkat lunak sumber terbuka LF di Tiongkok. Ia menerima gelar sarjana di bidang Internet of Things (IOT) dari Institut Rekayasa Perangkat Lunak Guangzhou. Dia menghabiskan karirnya dengan berpartisipasi dan memimpin proyek-proyek di bidang CI/CD, DevOps, manajemen infrastruktur TI, perangkat Cloud-Native, kontainerisasi, dan pengoptimalan proses kompilasi.

    Try Managed Milvus for Free

    Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.

    Get Started

    Like the article? Spread the word

    Terus Baca