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

un

게스트
1 / ?
수업 목록으로

한 GPU에서 16일간의 컴퓨트

단일 장기 실행

ANDREA-120M은 RTX 4090에서 ~23일이 걸립니다 (FP16, 6 스텝/분, 200K 스텝). 벽면 전력, 커널 패닉, 프록시 충돌, 그리고 의도적인 설정 변경이 그 기간 동안 모두 발생합니다. 체크포인트가 없으면 단일 장애가 전체 실행을 버립니다.


v1은 하나의 실수(lr=0.001 너무 공격적)로 27K 스텝을 잃었습니다. 왜냐하면 시작 지점보다 가까운 체크포인트가 없었기 때문입니다. v2는 그 교훈을 흡수했습니다: 체크포인트 주기를 100 스텝마다로 줄였고, CUDA 신호 핸들러가 SIGTERM에서 체크포인트 작성을 보장합니다.


세 가지 역할

체크포인트는 동시에 세 가지 역할을 수행합니다:


1. 복구 지점. 프로세스가 종료되거나, 머신이 재부팅되거나, 커널 패닉이 발생할 때: 최신 step_NNNNNN.bin에서 재개합니다.

2. 정책 전환 지점. 112,619단계: 재훈련 없이 커리큘럼을 변경합니다. SIGUSR1이 깨끗한 체크포인트를 강제하고, 프록시가 중지되며, 새로운 상한 및 하한이 제출되고, CUDA가 새로운 정책 하에 저장된 지점에서 재개합니다.

3. 감사 분기. 동일한 시작 가중치에서 두 가지 설정을 비교: 체크포인트를 복사하고, 두 개의 발산된 브랜치를 앞으로 실행하여 어느 쪽이 수렴하는지 관찰합니다.


100 스텝마다 쓰기 사이에 6 스텝/분으로 ~17분의 훈련이 이루어집니다. 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


영역별 설명


헤더 (총 8바이트). 32비트 스텝 번호는 이 스냅샷이 훈련 중 어디에 위치하는지 알려줍니다; 32비트 매개변수 수는 뒤따르는 세 배열의 크기를 알려줍니다.


가중치 (n_params x 4바이트). 모든 학습된 매개변수, 평탄화된 형태. 순서는 모델의 매개변수 반복자와 일치: 토큰 & 위치 임베딩, 그 다음 레이어별 어텐션 & MLP 가중치, 마지막으로 출력 헤드.


Adam 첫 번째 모멘트 m (n_params x 4바이트). 과거 그래디언트의 EMA (beta1 = 0.9). 가중치와 동일한 형태. AdamW 재개에 필요.


Adam의 두 번째 모멘트 v (n_params x 4 bytes). 과거 제곱 그래디언트의 EMA (beta2 = 0.999). 가중치와 동일한 형태. AdamW 재개에 필요.


총 크기

총 바이트 = 8 + 12 x n_params. ANDREA-12M (12.8M params): 디스크상 154 MB (147 MB 반올림). ANDREA-120M (~120M params) FP32: ~1.44 GB. 동일한 형태의 세 배열이 연속으로 쌓여 있고, 작은 헤더가 있음.


m & v를 저장하는 이유

Vanilla Adam은 m & v를 통해 매개변수별 학습률을 추적합니다. 체크포인트 작성 시 이를 버리면 재개된 실행이 0 모멘텀과 0 분산 추정으로 시작하여, 한 단계 동안 학습률 0과 갑작스러운 램프에 해당합니다. 손실이 급등하고; 모델이 현재 basin에서 벗어날 수 있습니다. m & v를 저장하면 재개가 비트 등가 (dataloader 무작위성 제외)로 never-stopped 기준과 같아집니다.

하나의 체크포인트 크기 계산

ANDREA-120M은 FP32(부동소수점당 4바이트)로 훈련된 약 120,000,000개의 파라미터를 보유합니다. 계산: (a) 헤더만 사용한 바이트; (b) 세 개의 float32 배열(가중치 + m + v) 합계 사용 바이트; (c) 총 체크포인트 크기(MB). 산술 과정을 보여주세요.

SIGTERM & SIGUSR1

왜 CUDA가 신호를 처리하는가

훈련은 장기 실행되는 전경 프로세스로 동작합니다. 프록시나 운영자가 GPU를 중지시키고자 할 때, CUDA 엔진으로 신호가 전송됩니다. 핸들러가 없으면 기본 SIGTERM이 프로세스를 즉시 종료시킵니다: 진행 중인 그래디언트 계산이 버려지고, 마지막 체크포인트 이후의 최신 가중치가 손실됩니다. 핸들러가 있으면 엔진이 먼저 체크포인트를 작성한 후 깨끗하게 종료합니다.


SIGTERM: 작성 & 종료

중지 버튼, systemctl stop, 또는 상위 프록시의 kill에 의해 전송됩니다. CUDA는 현재 단계를 완료한 후 step_NNNNNN.bin을 디스크에 작성하고 종료합니다. 이 상태에서 복구하려면 최신 .bin만 필요합니다: 진행 중인 부분 단계 외에는 작업이 손실되지 않습니다.


SIGUSR1: 작성 & 계속

운영자나 프록시 스크립트에 의해 필요 시 전송됩니다. CUDA는 현재 단계를 완료한 후 step_NNNNNN.bin을 작성하고, 아무 일도 없었던 것처럼 훈련을 계속합니다. 유용한 경우: 구성 변경 직전에 감사 지점을 트리거; 알려진 좋은 순간에 가중치 캡처; 외부 샘플 품질 평가 실행과 체크포인트 정렬.


폴란드 피벗 시퀀스 (단계 112,619)

1. 운영자가 CUDA에 SIGUSR1을 보냅니다. 체크포인트는 다음 100단계 경계(단계 112,700)에서 기록됩니다.

2. 운영자가 프록시를 중지합니다.

3. .samples.json & .state.json이 아카이브됩니다 (샘플 로그 & 밴디트 상태가 역사적 기록으로 보존됩니다).

4. .loss.json은 제자리에 유지됩니다. 누적 훈련 기록; 절대 아카이브되지 않습니다.

5. 프록시가 새로운 상한 & 하한으로 재시작됩니다.

6. CUDA가 step_112700.bin에서 새로운 밴디트지만 전체 가중치, m, & v로 재개합니다.


손실 기록이 피벗을 가로질러 끊김 없이 계속됩니다. 샘플 로그가 깨끗하게 재설정됩니다. Bandit이 새 정책 아래에서 새 출발을 합니다.

신호 선택하기

두 시나리오. (a) 프록시 스크립트가 v3-base에서 v3-polish 캡으로 전환 직전에 훈련을 멈추지 않고 스냅샷을 캡처하려 합니다. 어떤 신호? 왜? (b) 호스트의 `systemctl stop unhomeschool-train`이 계획된 재부팅 중에 실행됩니다. systemd가 기본으로 보내는 신호는? CUDA의 핸들러는 무엇을 하나요?

누적 훈련 기록

세 개의 Sidecar 파일

모든 체크포인트와 함께 프록시는 실행 디렉토리에 세 개의 JSON sidecar 파일을 유지합니다:


- .loss.json -- 단계당 하나의 항목, 영원히. 실행 종료 시 ~200,000개 항목. 누적 훈련 기록.

- .samples.json -- 감사용 최근 생성 샘플. 폴리시 피벗 시 초기화.

- .state.json -- bandit arm pulls, EMA rewards, phase counters. 폴리시 피벗 시 초기화.


무엇이 초기화되고, 무엇이 지속되는가

폴란드 피벗은 정책 변경이지, 실행 재설정이 아닙니다. 모델의 가중치, m, v, 및 손실 기록은 모두 끊김 없이 계속됩니다. 밴디트의 누적 보상은 계속되지 않습니다: 새로운 상한 및 하한이 다른 정책을 정의하며, 밴디트는 새로운 정책 하에서 깨끗한 상태에서 다시 학습해야 합니다.


.loss.json이 유지되는 이유

손실 기록은 실행의 감사 추적 역할을 합니다. ANDREA-120M에 대한 모든 발표된 주장(110K 스텝에서의 손실 EMA, 폴란드-피벗 복구, 112K 스텝에서의 수렴)은 이 파일의 항목으로 거슬러 올라갑니다. 단계 사이에 .loss.json을 아카이빙하면 독자들이 실행을 재구성하기 위해 조각들을 이어 붙여야 합니다; 이를 추가 전용(append-only)으로 유지하고 건드리지 않음으로써 출처를 보존합니다.


좀비 팔 교훈

112,619 스텝에서 .state.jsonrepo-docstrings 팔이 이전 실행에서 가져온 가중치 1.546을 지닌 채 발견되었습니다. 밴디트 상태는 이전 재시작에서 보존되었으나 데이터 소스가 더 이상 사용 불가능하여 탐색 회계를 왜곡하는 좀비 풀을 생성했습니다. 교훈: 밴디트 상태는 재시작을 가로질러 놀랍게 표류할 수 있습니다. 손실 기록은 실행의 전체 수명 동안 건드려서는 안 되는 유일한 파일입니다.


모든 것을 지배하는 하나의 규칙

.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 memory).

무엇이 구축되었고 왜

다섯 가지 결정

1. Cadence: 매 100 스텝마다. 복구 지점 세분화 ~17분. sample_every와 정렬되어 매 체크포인트가 하나의 새로운 샘플 감사에 해당.

2. Format: 헤더 + 3 배열. 최소화: 8바이트 헤더가 각 후속 배열의 크기를 알려줌. 메타데이터 팽창 없음. m & v가 저장될 때 비트 동일 복구.

3. Signals: SIGTERM & SIGUSR1. 두 역할, 두 신호. 기본 systemd 종료는 SIGTERM을 통해 깨끗한 체크포인트를 받음; 주문형 감사 지점은 중단 없이 SIGUSR1을 통해 깨끗한 체크포인트를 받음.

4. Loss continuity: 절대 아카이빙되지 않음. 누적 훈련 이력이 폴리시 피벗, 재시작, 정책 변경을 가로질러 지속됨. 전체 실행에 대한 하나의 감사 추적.

5. Bandit state: 리셋 허용. Bandit 정책은 한 번에 하나의 구성 아래에서 존재. 폴리시 피벗 시 리셋; 손실 이력은 계속됨. 두 다른 수명 주기가 동일한 실행 디렉토리를 공유.


이 레슨이 연결되는 것


- Activity 23 (grow_a_language_model_sample_audit). sample_every 캐던스가 체크포인트 캐던스와 일치; 둘 다 100 스텝마다 실행됩니다.

- Activity 24 (grow_a_language_model_microgpt_to_andrea). v1 collapse, v2.5 patch, v3 polish pivot 모두 작동하기 위해 깨끗한 체크포인트가 필요합니다.

- Activity 10 (grow_a_language_model_adamw). 체크포인트에 m & v를 저장하는 것이 중요합니다. 왜냐하면 AdamW의 업데이트 규칙이 둘 다에 의존하기 때문입니다. 이를 제거하고 재개하면 발산합니다.


마지막 엔지니어링 진리

코드가 저자를 능가합니다. 인프라가 건설자를 능가합니다. 간단한 체크포인트 형식이 옵티마이저 상태 저장을 건너뛴다고 약속한 모든 멋진 재개 스키마를 능가합니다. 바이트를 저장하세요; 실행을 저장하세요.

무엇을 만들 건가요?

작은 모델을 직접 훈련한다면, 이 다섯 가지 결정 중에서 어떤 것을 변경 없이 채택하고 어떤 것을 조정하겠습니까? 2-3문장으로 논의할 하나를 선택하세요. 정답은 없으며, trade-off에 대해 추론할 수 있는지가 질문입니다.