English· Español· Deutsch· Nederlands· Français· 日本語· ქართული· 繁體中文· 简体中文· Português· Русский· العربية· हिन्दी· Italiano· 한국어· Polski· Svenska· Türkçe· Українська· Tiếng Việt· Bahasa Indonesia

un

სტუმარი
1 / ?
უკან გაკვეთილებზე

ნიშანი, ექსპონენტა, მანტისა

IEEE 754 ფლოუტინგ-პოინტ ფორმატი

ნებისმიერი ფლოუტინგ-პოინტ ციფრი ინახავს სამ ველს:


- ნიშნის ბიტი (1 ბიტი): დადებითი ან უარყოფითი

- შენარჩუნება (E ბიტი): მასშტაბის სკალა, 2-ის მთელი ხარისხი

- მანტისა (M ბიტი): წილადის სიზუსტე, რიცხვი 1.0-სა და ~2.0-ს შორის


სულ ბიტები = 1 + E + M. მნიშვნელობა უდრის დაახლოებით (-1)^sign (1 + mantissa) 2^(exponent - bias).


შეგროვებისთვის ორი თვისებაა მნიშვნელოვანი:


დინამიური დიაპაზონი = 2^(2^E) (დაახლოებით). მეტი შენარჩუნების ბიტები ნიშნავს უფრო მცირე და უფრო დიდ რიცხვების წარმოდგენას გადაჭარბების გარეშე.


სიზუსტე = 2^M განსხვავებული მნიშვნელობა ორის ხარისხზე. მანტისის მეტი ბიტი ნიშნავს უფრო დახვეწილ წარმოდგენას ორის კონსეკუტიულ ხარისხებს შორის.


სამი ფორმატი


ფორმატისულ ბიტებინიშანიექსპ.მანტ.დინამიური დიაპაზონისიზუსტე
FP32321823~10^-38-დან ~10^38-მდე~7 ციფრი
FP16161510~10^-5 to ~10^5~3 ციფრი
FP8 E4M38143~2^-9 to ~448~2 ციფრი

FP8 E4M3 ნიშნავს „4 ექსპონენტის ბიტი, 3 მანტისის ბიტი“. ალტერნატიული FP8 E5M2 სიზუსტეს უცვლის დიაპაზონით; ANDREA ექსპერიმენტები იყენებენ E4M3-ს, რადგან ტრანსფორმერის აქტივაციები რჩება ვიწრო მაგნიტუდის დიაპაზონებში, სადაც დამატებითი სიზუსტე უკეთესია დამატებითი დიაპაზონისგან.

ბაიტი პარამეტრზე

ANDREA-120M შეიცავს დაახლოებით 120,000,000 პარამეტრს. გამოთვალე მხოლოდ წონის მატრიცების შენახვის მოცულობა (a) FP32-ში, (b) FP16-ში, (c) FP8-ში. აჩვენე შენი არითმეტიკა MB-ში. შემდეგ გამოთვალე (d) შენახვის მოცულობა წონა + Adam პირველი მომენტი + Adam მეორე მომენტი (3x წონის რაოდენობა) FP16-ში.

რატომ მუშაობს დაბალი სიზუსტე უფრო სწრაფად

მეხსიერების ბანდვიდთი განსაზღვრავს სწავლების სიჩქარეს

თანამედროვე GPU-ები მეტ დროს ხარჯავენ მეხსიერებაზე ლოდინში, ვიდრე გამოთვლებში. RTX 4090-ს აქვს 1008 GB/s მეხსიერების ბანდვიდთი და 165 TFLOPS FP16 გამოთვლა. ტიპური ფენა კითხულობს წონებს VRAM-დან, მუტემატიკურად მუტემატიკურად ადამრავლებს აქტივაციებს, უბრუნდება შედეგებს. ბანდვიდთი, არა გამოთვლა, განსაზღვრავს პროდუქტიულობას.


სიზუსტის ორჯერ შემცირება ორჯერ ამცირებს ბაიტებს პარამეტრზე, ამიტომ იგივე წონების წაკითხვა იყენებს ნახევარ ბანდვიდთს. პროდუქტიულობა დაახლოებით ორჯერ იზრდება.


ტენსორის ბირთვები: აპარატურით გაძლიერებული მატრიცის გამრავლება

RTX 4090 მოწოდებულია სპეციალური ტენსორის ბირთვის ერთეულებით, რომლებიც პირდაპირ ახდენენ მატრიცის გამრავლებას FP16 ან FP8-ში. ერთი ტენსორის ბირთვის ოპერაცია გამრავლებს მცირე ბლოკს (მაგ. 16x16) ერთ ციკლში, რაც მნიშვნელოვნად უფრო სწრაფია, ვიდრე სკალარული FP32 გამრავლებები.


ემპირიული მონაცემები ANDREA-120M-დან:


სიზუსტენაბიჯები/წთშენიშვნები
FP32~3ბაზისური; ტენსორის ბირთვის აჩქარება არა
FP16~6cuBLAS tensor cores; 2x შეჩერება
FP8 E4M3~6tensor cores; შესადაგებელი FP16-თან

FP8 არ გადაუსწრებს FP16-ს გამოყენების მაჩვენებელში ამ დატვირთვაში, რადგან გამოთვლის გამოყენების მაჩვენებელი აღარ იყო ბოთლნეკი; მეხსიერების სიჩქარე და გაშვების ზედმეტი დატვირთვა გახდა შეზღუდვა. ANDREA-120M v3 გამოდის FP16 cuBLAS-ზე 6 ნაბიჯი/წუთში კომფორტული უსაფრთხოების მარჟისთვის გამოყენების მაჩვენებლის დაკარგვის გარეშე.


NaN რისკი FP8-ზე

FP8 E4M3 წარმოადგენს რიცხვებს ~2^-9-დან ~448-მდე. აქტივაციები ან გრადიენტები ამ დიაპაზონის გარეთ გადმოდის NaN-ად (არა რიცხვი) ან შეღწევად ნულამდე. ერთი NaN აზიანებს ყველა შემდგომ გამოთვლას: მატრიცის გამრავლება NaN-ით აბრუნებს მთლიანად NaN-ებს; მთლიანად NaN გრადიენტები აზიანებს AdamW-ის მდგომარეობას; AdamW NaN m & v-ით გამოსცემს NaN განახლებებს; წონები ხდება NaN; მთელი სწავლების პროცესი მკვდარი ხდება.


ANDREA-ის FP8 ექსპერიმენტებმა გამოიწვია ზოგჯერ NaN კლიფები, რაც მოითხოვდა loss scaling-ს, დაგეგმილ სიზუსტის გადართვას ან fallback გზებს. FP16-ის დინამიკური დიაპაზონი (~10^-5 დან ~10^5-მდე) საკმარისად ფართოა იმისთვის, რომ NaN მოვლენები იშვიათი დარჩეს კომპლექსური scaling ტრიუკების გარეშე.


Precision Comparison: FP32 vs FP16 vs FP8

სიზუსტის შერჩევა ახალი გაშვებისთვის

შენ იწყებ ANDREA-სტილის ახალ ტრენინგ გაშვებას RTX 4090-ზე. შენ გაქვს ორი კონფლიქტური პრიორიტეტი: (1) მაქსიმალურად გაზარდო ნაბიჯები/წუთში, (2) მოერიდე NaN კრაშების დებაგინგს ტრენინგის შუაში. ANDREA-120M v3-მა აირჩია FP16 cuBLAS FP8 E4M3-ის ნაცვლად მიუხედავად იმისა, რომ ორივე მუშაობდა ~6 ნაბიჯი/წუთში. გაანალიზე, რატომ მოიგო FP16-მა ეს გადაწყვეტილება. შენს პასუხში მოახსენიე დინამიკური დიაპაზონი და tensor core მხარდაჭერა.

120M-ის მოთავსება ერთ 4090-ზე

შესავალი გაკვეთილიდან მიღებული 6-8x მამრავლის კოეფიციენტი

გაიხსენეთ grow_a_language_model_intro-დან, რომ ტრენინგის მეხსიერება უდრის დაახლოებით 6-8x ზუსტ წონის რაოდენობას, რომელიც ითვალისწინებს:


- წონა (1x)

- Adam პირველი მომენტი m (1x)

- Adam მეორე მომენტი v (1x)

- გრადიენტის ბუფერი (1x)

- აქტივაციები და დროებითი ცვლადები (~2-4x, დამოკიდებულია ბატჩზე და კონტექსტზე)


ANDREA-120M FP16-ზე batch_size=8, context=1024-ით:


კომპონენტიFP16 ზომა
წონები240 მბ
m (პირველი მომენტი)240 MB
v (მეორე მომენტი)240 MB
გრადიენტები240 MB
აქტივაციები~2-4 GB (ბატჩი, ctx)
სულ~3.5 GB

RTX 4090 აქვს 24 GB VRAM. ANDREA-120M იყენებს ~14%-ს FP16-ზე. ბევრი ადგილია უფრო დიდი ბატჩის ზომების ან უფრო გრძელი კონტექსტის ფანჯრებისთვის. ANDREA-12M-მა გამოიყენა მხოლოდ 1.4 GB სულ.


სად ცხოვრობს შერეული სიზუსტე

ANDREA არ ინახავს ყველაფერს ერთ სიზუსტეზე. შერეული სიზუსტის სწავლება ინახავს:


- ძირითადი წონები: FP32 (შენარჩუნებს სწავლების სტაბილურობას)

- წინსვლა და უკან დახევა გამოთვლა: FP16 (იყენებს tensor cores-ებს)

- AdamW ოპტიმიზატორის მდგომარეობა: FP32 (m & v სჭირდება სიზუსტე გრძელ ზნეობრივ განახლებებში)

- გრადიენტის ბუფერი: FP16 (გამოთვლის მხარე)


საბოლოო მეხსიერების ბიუჯეტი ორივეს შერევას წარმოადგენს. ANDREA-ს რეალური ფუტპრინტი მდებარეობს სუფთა FP16-ს (720 MB optimizer state) და სუფთა FP32-ს (1.44 GB optimizer state) შორის, უფრო ახლოს FP32-თან, რადგან m და v FP32-ში რჩება.

ბიუჯეტის ზომის შეფასება ANDREA-480M-სთვის

ANDREA-480M (ოჯახის მესამე დაგეგმილი წევრი) შეიცავს ~480 მილიონ პარამეტრს. შეაფასეთ (a) მხოლოდ FP16 წონები MB-ში, (b) FP16 წონები + m + v MB-ში (ვივარაუდოთ, რომ m და v ასევე FP16 სიმარტივისთვის), და (c) 6-8x მულტიპლიკატორის წესის მიხედვით, საერთო ტრენინგის ფუტპრინტი FP16-ში. ჯდება თუ არა ANDREA-480M ერთ RTX 4090-ზე (24 GB)?

სიზუსტე პრაქტიკაში

დაუშვებლად ვარაუდეთ, რომ ტრენინგის შუაში გაარკვიეთ, რომ ANDREA-120M ყოველ ~5000 ნაბიჯზე FP16-ზე ზოგჯერ გამოჰყოფდა NaN loss-ებს, & თითოეული NaN საჭიროებდა ჩეკპოინტიდან ხელახლა გაშვებას. რა **ერთი** ცვლილება სცადებდით პირველ რიგში NaN-ის სიხშირის შესამცირებლად FP16-დან გასვლის გარეშე? გაამართლეთ ერთი წინადადებით მექანიზმით.

მიმდებარე აქტივობები

სამი ძმა-და უკავშირდება სიზუსტეს:


- აქტივობა 1: შესავალი / VRAM ბიუჯეტი. სიზუსტე მყოფნურად ამრავლებს მეხსიერების ბიუჯეტის არითმეტიკის ყველა ტერმინს. 6-8x მყოფნური წესის ხელმძღვანელობა უმოქმედოა; bytes-per-param აძლევს მას ერთეულებს.

- აქტივობა 10: AdamW. ოპტიმიზატორის მდგომარეობა (m & v) ჩვეულებრივ რჩება FP32-ში, მაშინაც კი, როდესაც პირდაპირი/უკუის გამოთვლები მიმდინარეობს FP16-ში. მიზეზი: ოპტიმიზატორისთვის გრძელმსუბუქი აკუმულატორის სიზუსტე უფრო მნიშვნელოვანია, ვიდრე შესრულების სიჩქარე.

- აქტივობა 12: გრადიენტის კლიპინგი. კლიპინგი შეზღუდავს გრადიენტის მაგნიტუდებს ოპტიმიზატორის მდგომარეობის განახლებამდე. FP16 პირდაპირი/უკუის & FP32 ოპტიმიზატორის შემთხვევაში, კლიპინგი ხდება იმ საზღვარზე, სადაც სიზუსტე იცვლება & სადაც გადაჭარბების რისკი კონცენტრირდება.


სიზუსტე თავისუფალი რეგულატორია: შეცვალე იგი, მოდელი უფრო სწრაფად ვარჯიშდება & ნაკლებ მეხსიერებას იყენებს. ღირებულებაა ნუმერიკული სიფრთხილე: NaN-ის მართვა, loss scaling, mixed-precision დისციპლინა. ANDREA-120M v3 აჩვენებს შედეგს: 120M პარამეტრები გაწვრთნილია მომხმარებლის აპარატურაზე 23 დღეში, რადგან FP16 ყველაფერს ორჯერ შეამცირა.