nnScaler adalah mesin paralelisasi yang mengkompilasi model jaringan saraf dalam (DNN) yang dirancang untuk eksekusi GPU tunggal menjadi sebuah program yang mampu berjalan secara paralel di beberapa GPU.
Kemudahan Penggunaan: Hanya beberapa baris kode yang perlu diubah untuk mengaktifkan paralelisasi otomatis.
Pythonic: Output paralelisasi ada dalam kode PyTorch, sehingga memudahkan pengguna untuk memahaminya dan nyaman untuk pengembangan atau penyesuaian lebih lanjut.
Ekstensibilitas: nnScaler memaparkan API untuk mendukung operator baru untuk model baru.
Keandalan: Diverifikasi melalui berbagai sesi pelatihan end-to-end, nnScaler adalah sistem yang dapat diandalkan.
Performa: Dengan menjelajahi ruang paralelisasi yang besar, nnScaler dapat meningkatkan performa pelatihan paralel secara signifikan.
Bagi ilmuwan DNN , mereka dapat berkonsentrasi pada desain model dengan PyTorch pada GPU tunggal, sambil menyerahkan kompleksitas paralelisasi ke nnScaler. Ini memperkenalkan teknik paralelisme inovatif yang kinerjanya melampaui metode yang ada. Selain itu, nnScaler mendukung perluasan modul DNN dengan struktur atau pola eksekusi baru, memungkinkan pengguna memparalelkan model DNN kustom mereka.
Bagi pakar sistem DNN , mereka dapat memanfaatkan nnScaler untuk mengeksplorasi mekanisme dan kebijakan paralelisasi DNN baru untuk model yang sedang berkembang. Dengan menyediakan fungsi yang ditentukan pengguna untuk operator baru yang tidak dikenali oleh nnScaler, hal ini memastikan paralelisasi model DNN baru yang mulus. Misalnya, untuk memfasilitasi dukungan jangka panjang di LLM.
Instal paket berikut sebelum instalasi nnScaler:
Python >= 3.8, < 3.11 (3.10 is recommanded) PyTorch >= 2.0, < 2.4 (2.2.0 is recommanded)
Jalankan perintah di bawah ini di direktori nnScaler:
pip install -r requirements.txt pip install -e .
Selain itu, untuk menghindari kesalahan cppimport , direktori nnScaler juga perlu disertakan dalam variabel lingkungan PYTHONPATH :
export NNSCALER_HOME=$(pwd) export PYTHONPATH=${NNSCALER_HOME}:$PYTHONPATH
Instal paket yang diperlukan untuk menjalankan Llama-3. Selain itu, versi perpustakaan CUDA tertentu diperlukan selama instalasi flash-attn. Misalnya, CUDA V11.8 diperlukan jika menggunakan PyTorch 2.20.
python -m pip install transformers==4.40.0 flash-attn==2.5.5 tensorboard
Dapatkan akses model Llama-3 dari HuggingFace, di mana Anda akan menerima token akses yang harus ditetapkan sebagai variabel lingkungan:
export HF_TOKEN=<HUGGINGFACE_ACCESS_TOKEN>
Anda dapat menemukan semua kode contoh di examples/llama3_8B_128K
. Seperti yang ditunjukkan di bawah ini, pengguna perlu:
Bungkus Model: Sertakan perhitungan kerugian dan komponen lain yang diperlukan.
Konfigurasikan Komponen: Siapkan model, pengoptimal, dan pemuat data.
Inisialisasi dan Mulai: Pada fungsi utama, buat pelatih nnScaler dengan konfigurasi di atas dan mulai proses pelatihan.
# impor pelatih berkemampuan paralelisasi bawaan nnScaler dari nnscaler.cli.trainer impor Pelatih# model bungkus untuk menyertakan komputasi kerugian, dll.kelas WrapperModel(torch.nn.Module):def __init__(self, model_id):super(). __init__()self.model = AutoModelForCausalLM.from_pretrained(model_id, attn_implementation='flash_attention_2')def forward(self, sampel):outputs = self.model.model(input_ids=samples['net_input']['src_tokens'],use_cache=False,return_dict=False, )loss = torch.sum(chunk_linear_cross_entropy(outputs[0], self.model.lm_head.weight, sampel['target'], ...))kerugian pengembalian, sampel['ntokens'], sampel['nsentences'] def main(args):# data configdataloader_config = ... # model configmodel_config = ModelConfig(type=WrapperModel,args={'model_id': args.model_id, }, )# pengoptimal hyperparameter optimizer_config = OptimizerConfig(type=MixedPrecisionAdamW,args={'lr': 2e-5, 'betas': (0.9, 0.95), 'weight_decay': 0.0, 'fused': True},#... )#...# setup trainer dengan konfigurasi dataloader/model/optimizer, dll. trainer = Pelatih(train_args=TrainerArgs(#...model=model_config,optimizer=optimizer_config,dataloader=dataloader_config,#...))trainer.run()
Kemudian kita dapat memulai contohnya, dan semua tugas paralelisasi akan diselesaikan oleh nnScaler secara otomatis.
contoh cd/llama3_8B_128K# menyiapkan data pelatihan:python bookcorpus.py --data_path_or_name bookcorpus/bookcorpus --tokenizer_path_or_name meta-llama/Meta-Llama-3-8B-Instruct --save_path ./bookcorpus_llama3_4K --sequence_length 4096# membuat model minipython create_mini_model.py --model_id meta-llama/Meta-Llama-3-8B-Instruct --output_id ./llama3_mini#compile dan jalankan menggunakan paralelisme data + zero1torchrun --nproc_per_node=2 train.py --plan_ngpus 1 --runtime_ngpus 2 --nama llama3_debug --model_id ./llama3_mini --dataset_path ./bookcorpus_llama3_4K
Kami juga memberikan contoh untuk mendemonstrasikan cara memparalelkan model melalui antarmuka yang kompatibel dengan PyTorch Lightning di nnScaler.
Temukan contoh nanoGPT di repo nnScaler:
contoh cd/nanogpt
Instal dependensi nanoGPT:
instalasi pip -r persyaratan.txt
Siapkan kumpulan data:
python nanoGPT/data/shakespeare_char/prepare.py
Uji dengan GPU Tunggal
Sekarang Anda dapat menjalankan train_nnscaler.py
dengan torchrun <https://pytorch.org/docs/stable/elastic/run.html>
:
torchrun --nproc_per_node=1 train_nnscaler.py nanoGPT/config/train_shakespeare_char.py
Ini akan melatih model bayi GPT pada satu GPU. Ini akan memakan waktu beberapa menit dan kerugian validasi terbaik adalah sekitar 1,47.
Uji dengan Multi-GPU
Secara default, nnScaler memparalelkan model melalui GPU dengan paralelisme data . Jika Anda memiliki 4 GPU pada satu node:
torchrun --nproc_per_node=4 train_nnscaler.py nanoGPT/config/train_shakespeare_char.py
Atau jika Anda memiliki beberapa node, misalnya 2 node dengan masing-masing 4 GPU:
# on each node torchrun --nnodes=2 --nproc_per_node=4 --rdzv-id=NNSCALER_NANOGPT --rdzv-backend=c10d --rdzv-endpoint=<IP> train_nnscaler.py nanoGPT/config/train_shakespeare_char.py
CATATAN: Ukuran batch lokal ditetapkan secara default, jadi menggunakan lebih banyak pekerja akan menghasilkan ukuran batch global yang lebih besar.
? Untuk penggunaan tingkat lanjut, harap nantikan rilis kami yang akan datang.
nnScaler telah diadopsi oleh banyak proyek, termasuk eksplorasi produk dan penelitian:
(YOCO)Anda hanya melakukan cache sekali: Arsitektur decoder-decoder untuk model bahasa
LongRoPE: Memperluas jendela konteks LLM melampaui 2 juta token
Pasca pelatihan untuk versi konteks panjang dari seri Phi-3
Anda dapat menemukan Evaluasi Artefak untuk OSDI'24 dengan panduan di sini. Silakan kutip nnScaler dalam publikasi Anda jika itu membantu penelitian Anda:
@inproceedings{lin2024nnscaler, title = {nnScaler: Constraint-Guided Parallelization Plan Generation for Deep Learning Training}, author={Lin, Zhiqi and Miao, Youshan and Zhang, Quanlu and Yang, Fan and Zhu, Yi and Li, Cheng and Maleki, Saeed and Cao, Xu and Shang, Ning and Yang, Yilei and Xu, Weijiang and Yang, Mao and Zhang, Lintao and Zhou, Lidong}, booktitle={18th USENIX Symposium on Operating Systems Design and Implementation (OSDI 24)}, pages={347--363}, year={2024} }
Proyek ini menyambut baik kontribusi dan saran. Sebagian besar kontribusi mengharuskan Anda menyetujui Perjanjian Lisensi Kontributor (CLA) yang menyatakan bahwa Anda berhak, dan memang benar, memberi kami hak untuk menggunakan kontribusi Anda. Untuk detailnya, kunjungi https://cla.opensource.microsoft.com.
Saat Anda mengirimkan permintaan tarik, bot CLA akan secara otomatis menentukan apakah Anda perlu memberikan CLA dan menghiasi PR dengan tepat (misalnya, pemeriksaan status, komentar). Cukup ikuti instruksi yang diberikan oleh bot. Anda hanya perlu melakukan ini sekali di seluruh repo menggunakan CLA kami.
Proyek ini telah mengadopsi Kode Etik Sumber Terbuka Microsoft. Untuk informasi lebih lanjut, lihat FAQ Pedoman Perilaku atau hubungi [email protected] jika ada pertanyaan atau komentar tambahan.
Proyek ini mungkin berisi merek dagang atau logo untuk proyek, produk, atau layanan. Penggunaan resmi atas merek dagang atau logo Microsoft tunduk dan harus mengikuti Pedoman Merek Dagang & Merek Microsoft. Penggunaan merek dagang atau logo Microsoft dalam versi modifikasi proyek ini tidak boleh menimbulkan kebingungan atau menyiratkan sponsor Microsoft. Segala penggunaan merek dagang atau logo pihak ketiga tunduk pada kebijakan pihak ketiga tersebut.
Anda dapat menemukan repo publik kami dari https://github.com/microsoft/nnscaler atau repo internal microsoft https://aka.ms/ms-nnscaler. Untuk pertanyaan atau permintaan apa pun, silakan hubungi kami di [email protected].