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

un

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

თექვსმეტი დღე გამოთვლა ერთ GPU-ზე

ერთი გრძელი გაშვება

ANDREA-120M იღებს დაახლოებით 23 დღეს RTX 4090-ზე (FP16, 6 ნაბიჯი/წთ, 200K ნაბიჯი). კედლის ელექტროენერგია, ბირთვის პანიკები, პროქსის ავარიები და განზრახ კონფიგურაციის ცვლილებები ხდება ამ პერიოდში. საკონტროლო წერტილების გარეშე ერთი შეცდომა ანადგურებს მთელ გაშვებას.


v1 დაკარგა 27K ნაბიჯი ერთი შეცდომის გამო (lr=0.001 ძალიან აგრესიული იყო), რადგან საკონტროლო წერტილი არ იყო უფრო ახლოს, ვიდრე გაშვების წერტილი. v2 აითვისა ეს გაკვეთილი: საკონტროლო წერტილების სიხშირე შემცირდა ყოველ 100 ნაბიჯზე, და CUDA სიგნალის დამმუშავებელი უზრუნველყოფს საკონტროლო წერტილის ჩაწერას SIGTERM-ზე.


სამი როლი

ჩეკპოინტი ერთდროულად სამ სამუშაოს ასრულებს:


1. აღდგენის წერტილი. პროცესი კვდება, მანქანა გადაიტვირთება, ბირთვი პანიკობს: განაგრძეთ ბოლო step_NNNNNN.bin-დან.

2. პოლიშის პივოტი. ნაბიჯი 112,619: შეცვალეთ სასწავლო პროგრამა ხელახალი სწავლების გარეშე. SIGUSR1 აიძულებს სუფთა ჩეკპოინტს, პროქსი ჩერდება, ახალი caps და floors იგზავნება, CUDA განაგრძობს შენახული წერტილიდან ახალი პოლიტიკით.

3. აუდიტის ფორკი. შეადარეთ ორი კონფიგურაცია ერთი და იგივე საწყისი წონებით: დააკოპირეთ ჩეკპოინტი, გაუშვით ორი განსხვავებული ფილიალი წინ, დააკვირდით რომელი კონვერგირდება.


ყოველ 100 ნაბიჯს ეძლევა დაახლოებით 17 წუთი ვარჯიში ჩაწერებს შორის 6 ნაბიჯი/წუთი სიჩქარით. 100 ნაბიჯი ასევე ემთხვევა sample_every-ს: ყოველი ჩეკპოინტი შეესაბამება ერთ ახალ სემპლის აუდიტს და ყოველი სემპლის აუდიტი შეესაბამება აღდგენად წერტილს.

სამი როლი ერთი ფაილისთვის

დაასახელეთ ორი განსხვავებული დავალება, რომელსაც ჩეკპოინტის ფაილი ასრულებს ავარიის აღდგენის გარდა. მიეცით ერთწინადადებიანი მიზეზი თითოეულისთვის.

ხუთი რეგიონი ერთ ფაილში

ფორმატი

ყოველი step_NNNNNN.bin შეიცავს ხუთ უწყვეტ რეგიონს:


[int32 step] [int32 n_params] [n_params x float32 weights] [n_params x float32 m] [n_params x float32 v]

ANDREA Checkpoint Binary Format


რეგიონი რეგიონის მიხედვით


Header (სულ 8 ბაიტი). 32-ბიტიანი step რიცხვი გვიჩვენებს, თუ სად იმყოფება ეს snapshot ტრენინგში; 32-ბიტიანი პარამეტრების რაოდენობა გვეუბნება, რამდენად დიდია სამივე შემდგომი მასივი.


Weights (n_params x 4 ბაიტი). ყველა სწავლებადი პარამეტრი, ბრტყლად. თანმიმდევრობა ემთხვევა მოდელის პარამეტრების იტერატორს: token & position embeddings, შემდეგ თითოეული ფენის attention & MLP წონები, და ბოლოს output head.


Adam first moment m (n_params x 4 ბაიტი). წარსული გრადიენტების EMA (beta1 = 0.9). იგივე ფორმა, რაც weights-ს აქვს. საჭიროა AdamW-ის გაგრძელებისთვის.


ადამის მეორე მომენტი v (n_params × 4 ბაიტი). წარსული კვადრატული გრადიენტების EMA (beta2 = 0.999). იგივე ფორმა, რაც წონებს. აუცილებელია AdamW-ით გაგრძელებისთვის.


საერთო ზომა

სულ ბაიტები = 8 + 12 × n_params. ANDREA-12M (12.8M პარამეტრი): 154 MB დისკზე (147 MB დამრგვალებული). ANDREA-120M (~120M პარამეტრი) FP32: ~1.44 GB. სამი იდენტური ფორმის მასივი, ერთმანეთის მიყოლებით, პატარა header-ით.


რატომ ვინახავთ m & v-ს

ჩვეულებრივი Adam თვალს ადევნებს თითოეული პარამეტრის სწავლის სიჩქარეს m და v-ით. თუ მათ გამოტოვებთ ჩეკპოინტის ჩაწერისას, განახლებული გაშვება იწყება ნულოვანი მომენტუმით და ნულოვანი ვარიანსის შეფასებით — რაც ეკვივალენტურია ერთი სტეპისთვის სწავლის სიჩქარე 0-ის და შემდეგ მკვეთრი აჩქარების. Loss-ის მკვეთრი ზრდა; მოდელი შეიძლება გამოვიდეს მიმდინარე ბაზინიდან. m და v-ის შენახვა განახლებას ბიტ-ექვივალენტურს ხდის (დატალოდერის შემთხვევითობის გარდა) არასოდეს გაჩერებულ ბაზისთან შედარებით.

ერთი ჩეკპოინტის ზომა

ANDREA-120M შეიცავს ~120,000,000 პარამეტრს, რომლებიც გაწვრთნილია FP32-ში (4 ბაიტი ერთ float-ზე). გამოთვალეთ: (a) ბაიტები, რომლებსაც მხოლოდ header იყენებს; (b) ბაიტები, რომლებსაც სამი float32 მასივი იყენებს ერთად (weights + m + v); (c) ჯამური ჩეკპოინტის ზომა MB-ში. აჩვენეთ თქვენი გამოთვლები.

SIGTERM & SIGUSR1

რატომ ამუშავებს CUDA სიგნალებს

ტრენინგი მუშაობს როგორც გრძელვადიანი წინა პლანის პროცესი. როდესაც პროქსი ან ოპერატორი GPU-ს გაჩერებას ითხოვს, სიგნალი გადაეცემა CUDA ძრავას. დამმუშავებლის გარეშე, ნაგულისხმევი SIGTERM მაშინვე კლავს პროცესს: მიმდინარე გრადიენტის გამოთვლა იკარგება, ბოლო წონები ბოლო ჩეკპოინტის შემდეგ იკარგება. დამმუშავებლით, ძრავა ჯერ ჩეკპოინტს წერს და შემდეგ სუფთად გამოდის.


SIGTERM: ჩაწერა და გამოსვლა

იგზავნება stop ღილაკით, systemctl stop-ით ან მშობელი პროქსის kill-ით. CUDA ამთავრებს მიმდინარე სტეპს, წერს step_NNNNNN.bin დისკზე და შემდეგ გამოდის. აღდგენა ამ მდგომარეობიდან მხოლოდ უახლეს .bin-ს მოითხოვს: ნულოვანი სამუშაო იკარგება გარდა მიმდინარე ნაწილობრივი სტეპისა.


SIGUSR1: ჩაწერა და გაგრძელება

იგზავნება ოპერატორის ან პროქსი სკრიპტის მოთხოვნით. CUDA ამთავრებს მიმდინარე სტეპს, წერს step_NNNNNN.bin, შემდეგ აგრძელებს ტრენინგს ისე, თითქოს არაფერი მომხდარა. სასარგებლოა: აუდიტის წერტილის გამოწვევა კონფიგურაციის ცვლილებამდე; წონების ჩაჭერა ცნობილ-კარგ მომენტში; ჩეკპოინტის გასწორება გარე სემპლ-ხარისხის შეფასების გაშვებასთან.


პოლონური პივოტის თანმიმდევრობა (ნაბიჯი 112,619)

1. ოპერატორი უგზავნის SIGUSR1-ს CUDA-ს. ჩეკპოინტი იწერება შემდეგ 100-ნაბიჯიან საზღვარზე (ნაბიჯი 112,700).

2. ოპერატორი აჩერებს პროქსის.

3. .samples.json და .state.json არქივდება (სემპლის ლოგი და ბანდიტის მდგომარეობა ინახება როგორც ისტორიული ჩანაწერი).

4. .loss.json რჩება ადგილზე. კუმულაციური ტრენინგის ისტორია; არასოდეს არქივდება.

5. პროქსი ხელახლა იწყება ახალი caps-ითა და floors-ით.

6. CUDA განაგრძობს მუშაობას step_112700.bin-დან ახალი ბანდიტით, მაგრამ სრული წონებით, m-ითა და v-ით.


დანაკარგის ისტორია გრძელდება უწყვეტად პივოტის შემდეგაც. სემპლის ლოგი სუფთად აღდგება. Bandit იღებს ახალ დაწყებას ახალი პოლიტიკის ქვეშ.

სიგნალის არჩევა

ორი სცენარი. (a) პროქსი სკრიპტს სურს მიიღოს სნეპშოტი სწორედ იმ მომენტში, როცა ხდება გადასვლა v3-base-დან v3-polish caps-ზე, ტრენინგის შეჩერების გარეშე. რომელი სიგნალი? რატომ? (b) ჰოსტის `systemctl stop unhomeschool-train` გაშვებულია დაგეგმილი გადატვირთვის დროს. რომელ სიგნალს აგზავნის systemd ნაგულისხმევად? რას აკეთებს CUDA-ის ჰენდლერი?

კუმულაციური ტრენინგის ისტორია

სამი Sidecar ფაილი

ყველა checkpoint-თან ერთად, პროქსი ინახავს სამ JSON sidecar ფაილს run დირექტორიაში:


- .loss.json -- ერთი ჩანაწერი თითოეული step-ისთვის, მთელი დროის განმავლობაში. დაახლოებით 200,000 ჩანაწერი run-ის ბოლოს. კუმულაციური ტრენინგის ისტორია.

- .samples.json -- ბოლო დროს გენერირებული სემპლები აუდიტისთვის. აღდგება polish pivot-ებზე.

- .state.json -- bandit arm pulls, EMA rewards, phase counters. აღდგება polish pivot-ებზე.


რა აღდგება, რა რჩება

პოლონური პივოტები პოლიტიკის ცვლილებებია, არა გაშვების გადატვირთვები. მოდელის წონები, m, v და დანაკარგის ისტორია გრძელდება უწყვეტად. ბანდიტის დაგროვებული ჯილდოები არ გრძელდება: ახალი caps და floors განსაზღვრავს განსხვავებულ პოლიტიკას, და ბანდიტმა უნდა ხელახლა ისწავლოს ახალი პოლიტიკის ქვეშ სუფთა მდგომარეობიდან.


რატომ რჩება .loss.json

დანაკარგის ისტორია წარმოადგენს გაშვების აუდიტის კვალს. ყველა გამოქვეყნებული მტკიცება ANDREA-120M-ის შესახებ (დანაკარგის EMA 110K ნაბიჯზე, polish-pivot-ის აღდგენა, კონვერგენცია 112K ნაბიჯზე) უბრუნდება ამ ფაილში არსებულ ჩანაწერებს. .loss.json-ის არქივირება ფაზებს შორის მკითხველებს აიძულებს ფრაგმენტების შეერთებას გაშვების რეკონსტრუქციისთვის; მისი append-only და ხელუხლებელი შენახვა ინარჩუნებს წარმოშობას.


ზომბი მკლავის გაკვეთილი

ნაბიჯი 112,619 აღმოაჩინა repo-docstrings მკლავი .state.json-ში, რომელსაც ჰქონდა წონა 1.546 წინა გაშვებიდან. ბანდიტის მდგომარეობა შენარჩუნებული იყო ადრინდელი გადატვირთვის შემდეგ, მაგრამ მონაცემთა წყარო აღარ იყო ხელმისაწვდომი, რამაც წარმოქმნა ზომბი pulls, რომლებიც დაამახინჯეს კვლევის აღრიცხვა. გაკვეთილი: ბანდიტის მდგომარეობა შეიძლება მოულოდნელად გადაიხაროს გადატვირთვებს შორის. დანაკარგის ისტორია ერთადერთი ფაილია, რომელიც უნდა დარჩეს ხელუხლებელი გაშვების მთელი სიცოცხლის განმავლობაში.


ერთი წესი, რომელიც ყველას მართავს

.samples.json და .state.json თავისუფლად დაარქივეთ ფაზებს შორის. .loss.json არასოდეს დაარქივოთ. უახლესი .loss.json ყოველთვის არის კანონიკური სასწავლო ისტორია.

წესის გამოყენება

სამი მოქმედება პოლიშის პივოტის დროს 112,619-ე საფეხურზე. თითოეულისთვის მიუთითეთ ARCHIVE, KEEP IN PLACE ან RESET და მიუთითეთ ერთი წინადადებით მიზეზი: (a) `.samples.json`; (b) `.loss.json`; (c) `.state.json` (bandit მეხსიერება).

რა აშენდა და რატომ

ხუთი გადაწყვეტილება

1. კადენცია: ყოველ 100 სტეპზე. აღდგენის წერტილის გრანულარობა ~17 წუთი. შესაბამისია sample_every-სთან, რათა ყოველი ჩეკპოინტი შეესაბამებოდეს ერთ ახალ სემპლის აუდიტს.

2. ფორმატი: header + 3 მასივი. მინიმალური: 8-ბაიტიანი header გვეუბნება, რამდენად დიდია თითოეული მომდევნო მასივი. არანაირი მეტამონაცემების გადატვირთვა. ბიტ-ექვივალენტური გაგრძელება, როდესაც m და v ინახება.

3. სიგნალები: SIGTERM და SIGUSR1. ორი როლი, ორი სიგნალი. სტანდარტული systemd გამორთვა იღებს სუფთა ჩეკპოინტს SIGTERM-ით; მოთხოვნისამებრ აუდიტის წერტილები იღებენ სუფთა ჩეკპოინტს SIGUSR1-ით გაჩერების გარეშე.

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

5. Bandit მდგომარეობა: დასაშვებია გადატვირთვა. Bandit პოლიტიკა ცხოვრობს ერთ კონფიგურაციაში ერთდროულად. პოლიშ პივოტები აღადგენს; დანაკარგის ისტორია გრძელდება. ორი განსხვავებული სიცოცხლე იზიარებს ერთსა და იმავე გაშვების დირექტორიას.


რას უკავშირდება ეს გაკვეთილი


- აქტივობა 23 (grow_a_language_model_sample_audit). sample_every cadence ემთხვევა checkpoint cadence-ს; ორივე იწყება ყოველ 100 ნაბიჯში.

- აქტივობა 24 (grow_a_language_model_microgpt_to_andrea). v1 collapse, v2.5 patch, v3 polish pivot ყველა მოითხოვდა სუფთა checkpoint-ებს მუშაობისთვის.

- აქტივობა 10 (grow_a_language_model_adamw). m & v-ის შენახვა checkpoint-ში მნიშვნელოვანია, რადგან AdamW-ის განახლების წესი დამოკიდებულია ორივეზე. თუ მათ გამოტოვებთ და განაახლებთ, პროცესი გადაუხვევს.


ერთი ბოლო საინჟინრო ჭეშმარიტება

კოდი უფრო დიდხანს ცოცხლობს, ვიდრე ავტორები. ინფრასტრუქტურა უფრო დიდხანს ცოცხლობს, ვიდრე მშენებლები. მარტივი checkpoint ფორმატი უფრო დიდხანს ცოცხლობს, ვიდრე ნებისმიერი რთული resume სქემა, რომელიც დაჰპირდა optimizer state-ის შენახვის გამოტოვებას. შეინახეთ ბაიტები; შეინახეთ გაშვება.

რას ააგებთ?

თუ თქვენ თვითონ მოამზადებთ მცირე მოდელს, რომელი ამ ხუთი გადაწყვეტილებიდან დატოვებდით უცვლელად და რომელს შეცვლიდით? აირჩიეთ ერთი და განიხილეთ 2-3 წინადადებით. არ არსებობს არასწორი პასუხი; კითხვა იმაშია, შეძლებთ თუ არა გადაწყვეტილების კომპრომისების გააზრებას.