როგორ დავხვეწოთ Llama 2 70B PyTorch FSDP-ის გამოყენებით: საუკეთესო პრაქტიკები და გამოწვევების გადაჭრა
ეს ბლოგპოსტი დეტალურად განიხილავს Llama 2 70B მოდელის დახვეწას PyTorch FSDP-ის გამოყენებით. სტატია ფოკუსირებულია ძირითად გამოწვევებზე, როგორიცაა CPU RAM-ის გადატვირთვა, შუალედური ჩეკპოინტების შენახვის სირთულეები და VRAM-ის მოხმარების ოპტიმიზაცია. წარმოდგენილია გადაწყვეტები Hugging Face Transformers, Accelerate და TRL ინსტრუმენტების მეშვეობით, ასევე განხილულია Accelerate-ის გამოყენება SLURM-თან ერთად. მოცემულია საჭირო რესურსები და კონფიგურაციები შედეგების რეპროდუცირებისთვის.
ამ ბლოგპოსტში განვიხილავთ, თუ როგორ უნდა დავხვეწოთ Llama 2 70B PyTorch FSDP-ის გამოყენებით და მასთან დაკავშირებული საუკეთესო პრაქტიკები. ჩვენ გამოვიყენებთ Hugging Face Transformers-ს, Accelerate-ს და TRL-ს. ასევე ვისწავლით, თუ როგორ გამოვიყენოთ Accelerate SLURM-თან ერთად.
Fully Sharded Data Parallelism (FSDP) არის პარადიგმა, რომლის დროსაც ოპტიმიზატორის მდგომარეობები, გრადიენტები და პარამეტრები ნაწილდება მოწყობილობებს შორის. წინა გამავალი ეტაპის (forward pass) დროს, FSDP-ის თითოეული ერთეული ასრულებს „all-gather“ ოპერაციას სრული წონების მისაღებად, ხორციელდება გამოთვლა და შემდეგ ხდება სხვა მოწყობილობებიდან მიღებული ნაწილების (shards) გაუქმება. წინა გამავალი ეტაპის შემდეგ, გამოითვლება დანაკარგი (loss), რასაც მოჰყვება უკუ გამავალი ეტაპი (backward pass). უკუ გამავალი ეტაპის დროს, FSDP-ის თითოეული ერთეული ასრულებს „all-gather“ ოპერაციას სრული წონების მისაღებად, ადგილობრივი გრადიენტების მისაღებად შესრულებული გამოთვლებით. ეს ადგილობრივი გრადიენტები საშუალოვდება და ნაწილდება მოწყობილობებს შორის „reduce-scatter“ ოპერაციის მეშვეობით, რათა თითოეულ მოწყობილობას შეეძლოს თავისი ნაწილის პარამეტრების განახლება. დამატებითი ინფორმაციისთვის, თუ რა არის PyTorch FSDP, იხილეთ ეს ბლოგპოსტი: Accelerate Large Model Training using PyTorch Fully Sharded Data Parallel. (წყარო: ბმული)
**ტექნიკური მოთხოვნები:**
* კვანძების რაოდენობა: 2. მინიმალური მოთხოვნაა 1.
* GPU-ების რაოდენობა კვანძზე: 8
* GPU ტიპი: A100
* GPU მეხსიერება: 80GB
* კვანძშიდა კავშირი: NVLink
* RAM თითო კვანძზე: 1TB
* CPU ბირთვები თითო კვანძზე: 96
* კვანძთაშორისი კავშირი: Elastic Fabric Adapter
**ძირითადი გამოწვევები LLaMa 70B-ის FSDP-ით დახვეწისას:**
1. **CPU RAM-ის გადატვირთვა:** FSDP ახვევს მოდელს წინასწარ გაწვრთნილი მოდელის ჩატვირთვის შემდეგ. თუ კვანძში თითოეული პროცესი/რანგი ჩატვირთავს Llama-70B მოდელს, დასჭირდება 70*4*8 GB ~ 2TB CPU RAM (სადაც 4 არის ბაიტების რაოდენობა თითო პარამეტრზე და 8 არის GPU-ების რაოდენობა თითოეულ კვანძზე). ეს გამოიწვევს CPU RAM-ის მეხსიერებიდან ამოწურვას, რაც პროცესების შეწყვეტას გამოიწვევს.
2. **შუალედური ჩეკპოინტების შენახვის სირთულეები:** მთელი შუალედური ჩეკპოინტების შენახვა FULL_STATE_DICT-ის გამოყენებით CPU offloading-ით რანგ 0-ზე დიდ დროს მოითხოვს და ხშირად იწვევს NCCL Timeout შეცდომებს, მაუწყებლობისას განუსაზღვრელი დროით გაჭედვის გამო.
3. **საბოლოო მოდელის მდგომარეობის მოთხოვნა:** გაწვრთნის ბოლოს გვსურს მთელი მოდელის მდგომარეობის ლექსიკონი (state dict) და არა დაყოფილი (sharded) მდგომარეობის ლექსიკონი, რომელიც მხოლოდ FSDP-სთან არის თავსებადი.
საჭიროა სიჩქარის გაუმჯობესება და VRAM-ის გამოყენების შემცირება, რათა უფრო სწრაფად გავწვრთნათ და დავზოგოთ გამოთვლითი ხარჯები. ვნახოთ, როგორ გადავჭრათ ზემოთ აღნიშნული გამოწვევები და დავხვეწოთ 70B მოდელი!
**საჭირო რესურსები შედეგების რეპროდუცირებისთვის:**
* კოდის ბაზა: https://github.com/pacman100/DHS-LLM-Workshop/tree/main/chat_assistant/sft/training Flash Attention V2-ით
* FSDP კონფიგურაცია: https://github.com/pacman100/DHS-LLM-Workshop/blob/main/chat_assistant/training/configs/fsdp_config.yaml
* SLURM სკრიპტი launch.slurm: https://gist.github.com/pacman100/1cb1f17b2f1b3139a63b764263e70b25
* მოდელი: meta-llama/Llama-2-70b-chat-hf
* მონაცემთა ნაკრები: smangrul/code-chat-assistant-v1 (LIMA+GUANACO-ს ნარევი სწორი ფორმატირებით, გაწვრთნისთვის მზა ფორმატში)
**Flash Attention V2-ის ინსტალაციის ნაბიჯები:**
1. Dao-AILab/flash-attention: Fast and memory-efficient exact attention (github.com).
2. დააინსტალირეთ PyTorch-ის უახლესი "nightlies" ვერსიები CUDA ≥11.8-ით.
3. დააინსტალირეთ დარჩენილი მოთხოვნები DHS-LLM-Workshop/code_assistant/training/requirements.txt-ის მიხედვით.
4. აქ, ჩვენ დავაინსტალირებთ 🤗 Accelerate-ს და 🤗 Transformers-ს მთავარი ფილიალიდან (main branch).
**გამოწვევა 1-ის გადაჭრა:**
PR-ები huggingface/transformers#25107 და huggingface/accelerate#1777 წყვეტს პირველ გამოწვევას და არ საჭიროებს კოდის ცვლილებებს მომხმარებლის მხრიდან. ქვემოთ მოცემულია გამომავალი ფრაგმენტი 7B მოდელზე 2 GPU-ზე, რომელიც ზომავს მოხმარებულ მეხსიერებას და მოდელის პარამეტრებს სხვადასხვა ეტაპზე. ჩვენ შეგვიძლია დავაკვირდეთ, რომ წინასწარ გაწვრთნილი მოდელის ჩატვირთვის დროს, რანგ 0-ს და რანგ 1-ს აქვთ CPU-ს საერთო პიკური მეხსიერება შესაბამისად 32744 MB და 1506 MB. აქედან გამომდინარე, მხოლოდ რანგ 0 ტვირთავს წინასწარ გაწვრთნილ მოდელს, რაც იწვევს CPU RAM-ის ეფექტურ გამოყენებას. სრული ლოგები შეგიძლიათ იხილოთ აქ.
**გამოწვევა 2-ის გადაჭრა: ჩეკპოინტების შენახვის ოპტიმიზაცია:**
ის წყდება SHARDED_STATE_DICT state dict ტიპის არჩევით FSDP კონფიგურაციის შექმნისას. SHARDED_STATE_DICT ინახავს ნაწილს (shard) თითო GPU-ზე ცალკე, რაც აჩქარებს შენახვას ან ვარჯიშის განახლებას შუალედური ჩეკპოინტიდან. FULL_STATE_DICT-ის გამოყენებისას, პირველი პროცესი (რანგი 0) აგროვებს მთელ მოდელს CPU-ზე და შემდეგ ინახავს მას სტანდარტულ ფორმატში.
**Accelerate კონფიგურაციის შექმნა:**
შევქმნათ accelerate კონფიგურაცია ქვემოთ მოცემული ბრძანების მეშვეობით:
`accelerate config`
მიღებული კონფიგურაცია ხელმისაწვდომია აქ: fsdp_config.yaml. აქ, დაყოფის სტრატეგია არის FULL_SHARD. ჩვენ ვიყენებთ TRANSFORMER_BASED_WRAP-ს ავტომატური შეფუთვის პოლიტიკისთვის და ის იყენებს _no_split_module-ს Transformer ბლოკის სახელის საპოვნელად ბუდებული FSDP ავტომატური შეფუთვისთვის. ჩვენ ვიყენებთ SHARDED_STATE_DICT-ს შუალედური ჩეკპოინტების და ოპტიმიზატორის მდგომარეობების შესანახად ამ ფორმატში, რომელიც რეკომენდებულია PyTorch-ის გუნდის მიერ. დარწმუნდით, რომ ჩართეთ მოდულის პარამეტრების მაუწყებლობა რანგ 0-დან დასაწყისში, როგორც აღინიშნა ზემოთ მოცემულ აბზაცში გამოწვევა 1-ის მოგვარების შესახებ. ჩვენ ვრთავთ bf16 შერეული სიზუსტის ვარჯიშს. საბოლოო ჩეკპოინტისთვის, რომელიც არის მოდელის მთლიანი მდგომარეობის ლექსიკონი, გამოიყენება ქვემოთ მოცემული კოდის ფრაგმენტი:
```python
# მაგალითი: საბოლოო ჩეკპოინტის შენახვა სრული მოდელის მდგომარეობით
if accelerator.is_main_process:
accelerator.save_state("final_checkpoint", safe_serialization=True, full_deterministics=True)
```
Flash Attention-ის და გრადიენტური ჩეკპოინტინგის ჩართვა აუცილებელია უფრო სწრაფი ვარჯიშისთვის და VRAM-ის გამოყენების შესამცირებლად, რათა შესაძლებელი გახდეს დახვეწა და გამოთვლითი ხარჯების დაზოგვა. კოდის ბაზა ამჟამად იყენებს „monkey patching“-ს.
თეგები:
#ხელოვნური ინტელექტი
#llm
#მანქანური სწავლება
#gpu
#დიდი ენობრივი მოდელები
#ღრმა სწავლება
#hugging face
#pytorch
#დახვეწა
#fsdp
#accelerate
#მონაცემთა პარალელიზმი
#llama 2
#slurm
#გამოთვლითი ხარჯები
წყარო: huggingface.co
AI-ით გადამუშავებული
მსგავსი სტატიები
ხელოვნური ინტელექტი
Anthropic-ის Claude-ის აღზევება Apple App Store-ის რეიტინგებში პენტაგონთან მოლაპარაკებების ფონზე
ხელოვნური ინტელექტი
ტრამპის ადმინისტრაცია Anthropic-ს სანქციებს უწესებს ხელოვნური ინტელექტის გამოყენებაზე უარის გამო: ექსპერტი ინდუსტრიის უსაფრთხოების ხარვეზებზე საუბრობს
ხელოვნური ინტელექტი