Kertas | ? Koleksi HuggingFace | Halaman Diskusi
Kami memperkenalkan rangkaian model kode khusus dekoder Granit untuk tugas generatif kode (misalnya, memperbaiki bug, menjelaskan kode, mendokumentasikan kode), dilatih dengan kode yang ditulis dalam 116 bahasa pemrograman. Evaluasi komprehensif terhadap rangkaian model Kode Granit pada beragam tugas menunjukkan bahwa model kami secara konsisten mencapai kinerja tercanggih di antara LLM kode sumber terbuka yang tersedia.
Keuntungan utama model Kode Granit meliputi:
Keluarga Model Kode Granit hadir dalam dua varian utama:
Model dasar dan instruksi tersedia dalam ukuran parameter 3B, 8B, 20B, dan 34B.
Proses kami untuk menyiapkan data prapelatihan kode melibatkan beberapa tahap. Pertama, kami mengumpulkan kombinasi kumpulan data yang tersedia untuk umum (misalnya, GitHub Code Clean, data Starcoder), repositori kode publik, dan masalah dari GitHub. Kedua, kami memfilter data kode yang dikumpulkan berdasarkan bahasa pemrograman tempat data ditulis (yang kami tentukan berdasarkan ekstensi file). Kemudian, kami juga memfilter data dengan kualitas kode rendah. Ketiga, kami mengadopsi strategi deduplikasi agresif yang mencakup deduplikasi eksak dan fuzzy untuk menghapus dokumen yang memiliki konten kode (hampir) identik. Terakhir, kami menerapkan filter konten HAP yang mengurangi kemungkinan model menghasilkan bahasa yang penuh kebencian, kasar, atau tidak senonoh. Kami juga memastikan untuk menyunting Informasi Identifikasi Pribadi (PII) dengan mengganti konten PII (misalnya, nama, alamat email, kunci, kata sandi) dengan token yang sesuai (misalnya, ⟨NAME⟩, ⟨EMAIL⟩, ⟨KEY⟩, ⟨PASSWORD⟩) . Kami juga memindai semua kumpulan data menggunakan ClamAV untuk mengidentifikasi dan menghapus malware di kode sumber. Selain mengumpulkan data kode untuk pelatihan model, kami mengumpulkan beberapa kumpulan data bahasa alami berkualitas tinggi yang tersedia untuk umum untuk meningkatkan kemahiran model dalam pemahaman bahasa dan penalaran matematika.
Model Basis Kode Granit dilatih pada token data kode 3-4T dan kumpulan data bahasa alami yang terkait dengan kode. Data diberi token melalui byte pair coding (BPE), menggunakan tokenizer yang sama dengan StarCoder. Kami memanfaatkan data berkualitas tinggi dengan dua tahap pelatihan sebagai berikut:
Model Granite Code Instruct disempurnakan pada jenis data instruksi berikut: 1) penerapan kode yang bersumber dari CommitPackFT, 2) kumpulan data matematika berkualitas tinggi, khususnya kami menggunakan MathInstruct dan MetaMathQA, 3) Kumpulan data instruksi kode seperti Glaive-Code-Assistant- v3, Self-OSS-Instruct-SC2, Glaive-Function-Calling-v2, NL2SQL11 dan sedikit koleksi API sintetik kumpulan data panggilan, dan 4) kumpulan data instruksi bahasa berkualitas tinggi seperti HelpSteer dan Platipus versi filter lisensi terbuka.
Kami melakukan evaluasi ekstensif terhadap model kode kami pada daftar tolok ukur komprehensif yang mencakup namun tidak terbatas pada HumanEvalPack, MBPP, dan MBPP+. Serangkaian tolok ukur ini mencakup berbagai tugas pengkodean dalam bahasa pemrograman yang umum digunakan (misalnya, Python, JavaScript, Java, Go, C++, Rust).
Temuan kami mengungkapkan bahwa model Granite Code mengungguli model open source yang kuat di seluruh ukuran model. Gambar di bawah mengilustrasikan bagaimana Granite-8B-Code-Base
mengungguli Mistral-7B
, LLama-3-8B
, dan model sumber terbuka lainnya dalam tiga tugas pengkodean. Kami memberikan hasil evaluasi lebih lanjut dalam makalah kami.
Untuk menggunakan salah satu model kami, pilih model_path
yang sesuai dari:
ibm-granite/granite-3b-code-base-2k
ibm-granite/granite-3b-code-instruct-2k
ibm-granite/granite-8b-code-base-4k
ibm-granite/granite-8b-code-instruct-4k
ibm-granite/granite-20b-code-base-8k
ibm-granite/granite-20b-code-instruct-8k
ibm-granite/granite-34b-code-base-8k
ibm-granite/granite-34b-code-instruct-8k
from transformers import AutoModelForCausalLM , AutoTokenizer
device = "cuda" # or "cpu"
model_path = "ibm-granite/granite-3b-code-base-2k" # pick anyone from above list
tokenizer = AutoTokenizer . from_pretrained ( model_path )
# drop device_map if running on CPU
model = AutoModelForCausalLM . from_pretrained ( model_path , device_map = device )
model . eval ()
# change input text as desired
input_text = "def generate():"
# tokenize the text
input_tokens = tokenizer ( input_text , return_tensors = "pt" )
# transfer tokenized inputs to the device
for i in input_tokens :
input_tokens [ i ] = input_tokens [ i ]. to ( device )
# generate output tokens
output = model . generate ( ** input_tokens )
# decode output tokens into text
output = tokenizer . batch_decode ( output )
# loop over the batch to print, in this example the batch size is 1
for i in output :
print ( i )
Kami menggunakan Dolomite Engine untuk menyempurnakan (atau menyetel instruksi) semua model kami. Kami menyediakan contoh skrip untuk menyempurnakan ibm-granite/granite-3b-code-base
. Untuk menyempurnakan model, cukup ikuti langkah-langkah berikut:
git clone https://github.com/IBM/dolomite-engine/
cd dolomite-engine
# you might need to modify configs/granite-example/training.yml
sh scripts/finetune.sh configs/granite-example/training.yml
# once the model is trained, convert to HuggingFace-compatible safetensors
sh scripts/export.sh configs/granite-example/export.yml
Tip
Jika Anda ingin menggunakan trafo bebas padding untuk menghemat jejak memori dan FLOP selama pelatihan, ikuti instruksi di README Dolomite Engine untuk detail lebih lanjut.
Silakan periksa Pedoman dan Kode Etik kami untuk berkontribusi pada proyek kami.
Kartu model untuk setiap varian model tersedia di repositori HuggingFace masing-masing. Silakan kunjungi koleksi kami di sini.
Model pilihan (basis kode granit-3b dalam contoh ini) dapat dikloning menggunakan:
git clone https://huggingface.co/ibm-granite/granite-3b-code-base-2k
Semua Model Kode Granit didistribusikan di bawah lisensi Apache 2.0.
Harap beri tahu kami komentar Anda tentang rangkaian model kode kami dengan mengunjungi koleksi kami. Pilih repositori model yang ingin Anda berikan masukan. Lalu, buka tab Komunitas , dan klik Diskusi baru . Alternatifnya, Anda juga dapat mengirimkan pertanyaan/komentar apa pun di halaman diskusi github kami.