نقطه بازرسی ذخیره و ادامه
Type: Build
Languages: Python
Prerequisites: Phase 19 lessons 42 to 45
Time: ~90 minutes
اهداف یادگیری
- کل حالت آموزش را به یک بار مفید که می تواند به یک فرآیند تازه بارگذاری شود، جذب کنید.
- از پس انداز اتم با نوشتن به زمان استفاده کنید و سپس نامش را تغییر دهید تا یک تصادف هرگز یک فایل نیمه نوشته را ترک نکند.
- حالت RNG را برای پایتون، NumPy و PyTorch بازگرداندن تا پس از بازتاب، از دست دادن مطابق با خط پایه بدون وقفه باشد.
- یک طرح شیش کنترل نقطه برای مدل هایی که دیگر در یک فایل واحد قرار ندارند، با شیش های هاش تایید شده و شاخص JSON ایجاد کنید.
مشکل
تو يه شغل آموزش براي 18 ساعت قرار دادي ساعت دیوار 4 ساعت طول میکشه کلستر ساعت 11 باز شروع ميشه چون کسي بالاتر از درجه حقوق شما ارتقاء هسته رو تایید کرده بدون بازداشتگاهي از اول شروع ميکني بدون ادامه کار شما همچنین حالت بهینه سازی را که 11 ساعت اول برای یادگیری طول کشید، از دست می دهید، بنابراین حتی اگر وزن مدل زنده بماند، لحظات AdamW رفته اند و گام بعدی در جهت مسیر آموزش حرکت کرده است.
آرتیفاکت مناسب یک فایل واحد است که همه چیز لازم برای ادامه دارد: پارامترهای مدل، حالت بهینه سازی، حالت برنامه نویس، تاریخچه از دست دادن برای نقشه ها، مرحله فعلی و دوره و شمارشگر های دسته ای در دوره، و حالت RNG برای هر منبع تصادفی. بدون حالت RNG منحنی از دست دادن باز می گردد منحنی متفاوت است. همون مدل، همون داده، مخلوط مختلف، ماسک ترک مختلف، شماره مختلف روی داشبورد
ذخیره اتمی نیمه دیگر قرارداد است. نوشتن به نام فایل نهایی به معنای یک فایل خراب شده در نیمه نوشتن است؛ رزومه می خواند زباله. نوشتن به یک فایل موقت در همان دایرکتوری و سپس تغییر نام به معنای یک فایل خراب شده در نیمه نوشتن به معنای یک فایل خوب قبلی را بدون لمس می کند. نامگذاری اتمی در سیستم های فایل POSIX است.
مفهوم
flowchart TD ckpt[checkpoint payload] --> m[model state_dict] ckpt --> o[optimizer state_dict] ckpt --> s[scheduler state_dict] ckpt --> tr[train state: step, epoch, batch_in_epoch, losses] ckpt --> rng[rng state: python, numpy, torch_cpu, torch_cuda] ckpt --> meta[wall_saved_at, schema] ckpt --> write[atomic write: tmp file then os.replace]
پنج سطل دولت
| Bucket | Why it matters |
|---|---|
| Model | Weights and buffers; what the model is. |
| Optimizer | Momentum and adaptive moments; without these the next step is a different optimization problem. |
| Scheduler | Where the learning rate is on its curve; cosine schedules in particular care. |
| Train counters | Step, epoch, batch-in-epoch, plus the loss history that draws the dashboard. |
| RNG state | Determinism for dropout, data shuffling, and any sampling inside the model. |
ذخیره اتمی
flowchart LR payload[payload] --> tmpf[write to .ckpt.pt.XXXX.tmp] tmpf --> rename[os.replace to ckpt.pt] rename --> done[ckpt.pt is valid] crash1[crash before rename] --> orig[ckpt.pt unchanged] crash2[crash after rename] --> done
دو قانون: اول، فایل موقت در همان دایرکتوری با هدف زندگی می کند بنابراین نام تغییر در همان سیستم فایل باقی می ماند؛ نام تغییر در دستگاه های مختلف اتمی نیست. دوم، نام موقت برای هر تلاش منحصر به فرد است بنابراین دو نویسنده دست به دست نمی آورند.
نقاط بازرسی پاره شده
وقتی مدل بزرگ می شود، بار مفید یک فایل برای بارگذاری سریع، برای بازرسی بیش از حد بزرگ و دردناک می شود و وقتی یک شبکه در وسط خواندن شکاف را به اشتراک می گذارد. راه حل این است که حالت پارامتر را به قطعات تقسیم کنید و یک شاخص کوچک بنویسید که آنها را با هم متصل کند.
flowchart LR state[state_dict] --> split[split keys round robin into N shards] split --> s0[model.shard-000.pt] split --> s1[model.shard-001.pt] split --> sN[model.shard-NNN.pt] s0 --> idx[index.json] s1 --> idx sN --> idx meta[meta.pt: optimizer + scheduler + train_state + rng] --> idx
این شاخص تعداد شارت ها، sha256 هر شارت و sha256 فایل متا را ثبت می کند. بارگذاری کننده وقتی هر هش با هم مطابقت ندارد به شدت شکست می خورد. شارت ها می توانند روی دیسک های فیزیکی مختلف فرود آیند؛ میتا کوچک است و ابتدا می خواند.
ادامه ادامه ی رزومه در وسط دوره
رزومه ای که با شروع عصر بعدی زباله ها در هر نقطه از دقیقه تا روز باشد.(epoch, batch_in_epoch)علاوه بر حالت RNG. پس از بارگذاری، حلقه آموزشی سریع به جلو ژنراتور شماره تصادفی از طریق دسته های مصرف شده در دوره فعلی و ادامه داردbatch_in_epoch. کد درس دقیقاً این کار را انجام می دهد؛ ادعا این است که مسیر خسارت پس از ادامه کار با خط پایه بدون وقفه در 1e-4 مطابقت دارد.
آن را بسازید
code/main.pyچهار نوع اولیه و یک راننده دمو را ارائه می دهد.
مرحله اول: ضبط و بازگرداندن حالت RNG
capture_rng_stateبا پايتون يک فرمان باز ميادrandom.getstate، "نمپي"np.random.get_stateهر قطعه به عنوان اعداد ساده پایتون، tuples و لیست ها ذخیره می شود (آرایه کلید NumPy از طریق tolist()), بنابراین بارنده در مرحله 3 می تواند آن را بدون باز کردن اشیاء تعسفی دوباره بخواند. restore_rng_stateتنسور پردازنده يه بازخورد بايت Uint8 است که RNG PyTorch مي داند چطور مصرف مي کنه
مرحله دوم: ذخیره اتمی
atomic_saveبار مفید را به یک فایل موقت در دایرکتوری هدف می نویسد، سپس os.replaceبه اسم آخرش عوض ميشهatomic_write_jsonبرای شاخص پاره شده هم همین کار را می کند.
مرحله سوم: سفر برگشت کامل
save_checkpointمدل، بهینه ساز، برنامه نویس، حالت قطار و RNG را به یک فرمان بسته می کند. load_checkpointاون رو برگردونه و برگردونهTrainState. میدان شیما هوک ارتقا است: تغییرات آینده در فرمت به رشته نسخه و بارگذاری ها می رسد.
load_checkpointتماس هاtorch.load(..., weights_only=True)..ptپرونده يه جنجاليه و باز کردن پرونده ي غير قابل اعتماد باweights_only=Falseهر کد نام فایل را اجرا می کند. بارنده تنها وزن پذیرفته است تنسورها و ظرف های اولیه و رد همه چیز دیگر است که به همین دلیل مرحله 1 حالت RNG را در لیست های ساده نگه می دارد. بررسی های سالمیت افزایش می یابدValueErrorبه جای استفاده ازassert، چونpython -Oاز مشعل 2.6 یا جدیدتر استفاده کنید: قبل از این انتشارweights_only=Trueیک بازگذر شناخته شده (CVE-2025-32434) داشت، بنابراین تضمین این درس تنها از 2.6 ادامه دارد.
مرحله 4: فرقه ی پاره شده
save_sharded_checkpointکلید های پارامتر را در N شارت ها گرد می کند، هر شارت را با ذخیره ای اتمی خود می نویسد، یک فایل متا را با بهینه سازی و برنامه ریزی کننده و حالت قطار می نویسد و شاخص JSON را با شارت sha256s می نویسد. load_sharded_checkpointقبل از ادغام هر قطعه را تأیید می کند و هر مسیر قطعه ای را که خارج از دایرکتوری نقطه بازرسی حل شود رد می کند.
مرحله 5: نمایشی ادامه
run_resume_demoیک مدل کوچک برایtotal_steps، يه نقطه بازي درinterrupt_at، سپس ادامه می یابد. یک فرآیند دوم نقطه بازرسی را بازگرداند و مراحل باقیمانده را اجرا می کند. تابع حداکثر تفاوت مطلق بین دو مسیر از دست دادن را پس از نقطه قطع باز می آورد. با بازپرداخت RNG، تفاوت صفر یا صدا نقطه شناور است.
اجرا کن
bashpython3 code/main.pyدو پرونده و دو نمونه ی قطعه ای هم با حداکثر تفاوت تحت 1e-4 ارتباط دارند. خلاصه در outputs/resume-demo.json. .
ازش استفاده کن
آموزش تولید، کنترل کنترل کشتی را به عنوان بخشی از مربی به وجود می آورد. شکل یکسان است: مدل + بهینه کننده + برنامه نویس + شمارنده + RNG، نوشته شده به صورت اتمی، نامگذاری شده به مرحله ای به طوری که آخرین آن را پیدا کردن آسان است. طرح های شکسته شده حمل مدل های بزرگ را با خواندن موازی تقویت می کنند؛ index.json چیزی است که باعث می شود این کار شود.
چهار الگوی برای اجرا:
- Load with
weights_only=True.یک نقطه بازرسی که از یک دیسک مشترک یا یک دانلود گرفته شده است، ورودی غیرقابل اعتماد است. بارنده فقط وزن دارد که یک فایل مخرب را از اجرای کد در دستگاه که باز می گردد، نگه می دارد. - Schema is a string in the payload.بدونش نميتوني بدون شکستن راه هاي قدیمی شکل رو توسعه بدي
- Sha256 every shard.دانلود خاموشی که کوتاه شده است بدترین نوع خطا است؛ بارگذاری سریع یا دیر به شکست می رسد.
- Keep checkpoint cadence honest.هر قدم N و هر دقیقه ساعت دیوار را نگه دارید، هر لحظه کوتاه تر باشد، در غیر این صورت قدم طولانی که سقوط می کند، پنجره ای کامل کار را از دست می دهد.
-باده
outputs/skill-checkpoint-save-resume.mdاین نسخه برای هر اسکریپت آموزشی جدید است: شکل بار مفید، نوشتن اتمی، ضبط RNG، شاخص پاره شده. مهارت را به یک repo، سیم انداختنsave_checkpointدر محل ذخیره سازی دوره ای، سیمload_checkpointدر شروع، و فرار از مرگ زنده می ماند.
تمرینات
- از پاره کردن گرد و گرد با پاره کردن با دسته بندی بر اساس پارامتر (طبقات که در
.weightvs.biasچه زمانی هر طرحی ترجیح داده می شود؟ - لوله ذخیره سازی را برای حفظ آخرین نقاط بازرسی K گسترش دهید و نقاط قدیمی را برش دهید.
- اضافه کنید
--ckpt-every-secondsپرچم که یک ذخیره را در یک فاصله ساعت دیوار، نه فقط شمارش مراحل فعال می کند. - یک مسیر تایید چک سوم را اضافه کنید که در زمان راه اندازی اجرا می شود، هر نقطه بازرسی را در دایرکتوری اسکن می کند و گزارش می دهد که کدام یک فاسد هستند.
- اجرای یک
migrate_v1_to_v2تابع که یک فیلدی جدید را به بار مفید اضافه می کند و رشته شیما را به هم می رساند.
اصطلاحات کلیدی
| Term | What people say | What it actually means |
|---|---|---|
| Atomic save | "Write and pray" | Write to a temp file in the same directory, then os.replace into the target name |
| State dict | "The weights" | Model parameters and buffers, keyed by parameter name |
| Sharded checkpoint | "Big model file" | Multiple files, one per shard, plus a meta file and a JSON index with sha256s |
| RNG state | "Random seed" | Captured state for python random, numpy, torch CPU, torch CUDA; not just the seed |
| Mid-epoch resume | "Restart" | Fast-forward the RNG and continue from the next batch in the same epoch |
خواندن بیشتر
- POSIX
renameمعنی گرایی برای اتمیت ادعا می کند کهos.replaceبه اين مي پردازد - اسناد PyTorch در مورد
torch.saveوtorch.load، از جملهmap_locationبرای بازیابی دستگاه های مختلف وweights_onlyبرای بارگذاری فایل های غیر قابل اعتماد. - مرحله 19 درس 46 شامل جمع آوری گرادینت است که بار مفید نقطه بازرسی این درس از طریق آن زنده می ماند.
- مرحله 19 درس 48 پوشش موشک های توزیع شده که شکل دولت آن را این طرح می پذیرد.
- هسته لینوکس
fsyncاسناد تضمین دوام پشت نامگذاری اتمی.
This free lesson is part of the AI Engineering from Scratch curriculum. Read the full explanation, run the lesson code, and verify the result in the interactive reader or from the repository source.
Browse the complete course catalog or open this lesson on GitHub.