åå¸å¼è®ç»å¯å¨å½ä»¤è§£æ | AIçæåç¿»è¯
é®é¢ï¼ è§£éè¿ä¸ª SSH + tmux + torchrun å½ä»¤ä¸çæ¯ä¸ªåæ°ï¼è¯¥å½ä»¤ç¨äºå¯å¨ nanochat ç 2 èç¹åå¸å¼ CPU è®ç»è¿è¡ç master èç¹ã
åçï¼
è¿æ¯ä¸ä¸ªåå±å½ä»¤ï¼ssh â tmux â shell â torchrun â base_trainãéå±åè§£ã
第 1 å± â SSH å°è£
ssh lzw@<WORKSTATION_IP> "..."
卿¨ç Ubuntu å·¥ä½ç«ä¸ä»¥è¿ç¨ shell å½ä»¤ç形弿§è¡å¼å·å
çåç¬¦ä¸²ãæ«å°¾ç && echo OK ä»
å¨ tmux ä¼è¯å建æåæ¶æå° OK ââ 忍ç Mac åéä¸ä¸ªç®åçæåä¿¡å·ãæåç 0.6 䏿¯å½ä»¤çä¸é¨å ââ çèµ·æ¥æ¯ä¸ä¸ªç²è´´æ¶æ®ççé¢å¤å符ï¼å¯è½æ¯ Warp æ¶é´æ 注æ shell åå²ç段ï¼ã妿å®å¨å¼å·å
ï¼shell ä¼å°å
¶è§ä¸º echo OK çä¸ä¸ªåæ°ï¼æ ¹æ®ç°æåæ³ï¼å®ä½äºç»æå¼å·ä¹åï¼å æ¤ ssh å®é
ä¸ä¼å°å
¶ä½ä¸ºéå çè¿ç¨å½ä»¤ææ¬ï¼ä»¥ç©ºæ ¼è¿æ¥ï¼åéï¼å³è¿ç¨ä¼æ§è¡ ... && echo OK 0.6ãæ å®³ï¼ä½åºå é¤ã
第 2 å± â tmux ä¼è¯ç®¡ç
tmux kill-session -t dist-master 2>/dev/null
å¹çæ§ï¼ç»æ¢ä»»ä½å
åå为 dist-master çä¼è¯ï¼ä»¥ä¾¿éæ°è¿è¡å½ä»¤æ¶ä¸ä¼å âéå¤ä¼è¯âè失败ã2>/dev/null å¨é¦æ¬¡è¿è¡æ¶åæâä¼è¯æªæ¾å°âçé误ã
tmux new-session -d -s dist-master '...'
-dâ å离模å¼ï¼å建ä¼è¯ä½ä¸éå ç»ç«¯ãè¿å¾å ³é®ï¼å 为 SSH 伿å¼è¿æ¥ï¼tmux ä¼ä¿æè®ç»è¿ç¨åæ´»ï¼å³ä½¿ SSH ä¼è¯ç»æä¹ä¸åå½±åï¼ã-s dist-masterâ ä¼è¯åç§°ï¼æ¹ä¾¿æ¨ç¨å使ç¨tmux attach -t dist-masteræ¥ç宿¶è¾åºã- å¼å·å
çå符串æ¯ä¼è¯è¦è¿è¡çå½ä»¤ãå½å½ä»¤éåºæ¶ï¼ä¼è¯ç»æ ââ å æ¤æ«å°¾ç
sleep 600å¯ä»¥å¨è®ç»ç»æåä¿æçªæ ¼åæ´» 10 åéï¼ä»¥ä¾¿æ¨éå 忥çæç»çè¾åº/é误信æ¯ï¼ç¶å tmux æä¼åæ¶å®ã
2>&1 | tee /tmp/dist_master.log
å°æ åé误åå¹¶å°æ åè¾åºï¼torchrun å PyTorch 大éè®°å½æ¥å¿å°æ åé误ï¼ï¼ç¶å tee å°æ°æ®æµå¤å¶å° tmux çªæ ¼åæ¥å¿æä»¶ä¸ï¼æ¨å¯ä»¥ä»å¦ä¸ä¸ª SSH ä¼è¯ä¸ä½¿ç¨ tail -f æ¥ç该æ¥å¿ã
第 3 å± â ç¯å¢åé
IFNAME é
对æ¯å¤èç¹è®¾ç½®ä¸æå®¹æåºéçé¨åãéè¯¯çæ¥å£ä¼å¯¼è´ rendezvous å¨âçå¾
workersâé¶æ®µæ°¸è¿æèµ·ã
第 4 å± â torchrunï¼å¯å¨å¨ï¼
torchrun --nnodes=2 --nproc_per_node=1 --node_rank=0 \
--master_addr=<WORKSTATION_IP> --master_port=29500 \
-m scripts.base_train -- ...
--nnodes=2â ä¸çä¸å å« 2 å°æºå¨ãtorchrun ä¼é»å¡ï¼ç´å°ä¸¤ä¸ªèç¹å®æ rendezvousã--nproc_per_node=1â æ¯å°æºå¨ 1 个工ä½è¿ç¨ï¼æ¯ä¸ª CPU rank ä¸ä¸ªï¼ãæ»ä¸çå¤§å° = 2 à 1 = 2ã--node_rank=0â æ¬æºæ¯ masterï¼rank-0 主æºï¼ãæ¨ç第äºå°æºå¨å°è¿è¡ç¸åçå½ä»¤ï¼ä½ä½¿ç¨--node_rank=1ã--master_addr/--master_port=29500â TCP rendezvous ç¹ãRank 0 卿¤çå¬ï¼rank 1 è¿æ¥å°æ¤å°åã两个èç¹å¿ é¡»ä¼ éç¸åçå°å/端å£ã-m scripts.base_trainâ å°è®ç»èæ¬ä½ä¸ºæ¨¡åè¿è¡ï¼ä»¥ä¾¿scripts/å çå¯¼å ¥ä» nanochat ä»åºæ ¹ç®å½è§£æï¼è¿å°±æ¯åé¢cdå½ä»¤éè¦çåå ï¼ã--â åé符ï¼ä¹åçææå 容é½å°ä¼ éç»base_trainçåæ°è§£æå¨ï¼èé torchrunã
torchrun ä¼å¨æ¯ä¸ªçæè¿ç¨ä¸è®¾ç½® RANKãLOCAL_RANKãWORLD_SIZEãMASTER_ADDRãMASTER_PORT ç¯å¢åéï¼base_train å¨å
¶ dist.init_process_group() è°ç¨ä¸è¯»åè¿äºåéã
第 5 å± â base_train åæ°ï¼æ¨¡ååè¿è¡é ç½®ï¼
--device-type cpuâ ä½¿ç¨ Gloo å端ï¼ä¸ä½¿ç¨ CUDAãè¿æ¯åå¸å¼è®ç»çåºç¡è®¾æ½æµè¯ï¼èéçæ£è¿è¡ã--depth 4â 4 个 transformer å±ãnanochat 仿·±åº¦æ¨å¯¼æ¶æçå ¶ä½é¨åï¼--aspect-ratio 64âmodel_dim = depth à aspect_ratio = 4 à 64 = 256ãå æ¤æ¯ä¸ä¸ª 256 维模åã--head-dim 64â 对äºmodel_dim=256ï¼å³256/64 = 4个注æå头ã--max-seq-len 512â ä¸ä¸æé¿åº¦ä¸º 512 个 tokenï¼ä½¿æ³¨æå计ç®å¨ CPU ä¸çææ¬ä¿æå¾ä½ï¼ã--device-batch-size 2â æ¯ä¸ª rank æ¯æ¬¡ååä¼ æçå¾®æ¹æ¬¡ï¼2 个åºå à 512 个 token = æ¯æ¥æ¯ rank 1,024 个 tokenã--total-batch-size 2048â æ¯æ¬¡ä¼å卿¥éª¤çç®æ token æ°ãæ¢¯åº¦ç´¯ç§¯ç±æ¤æ¨å¯¼ï¼2048 / (2 ranks à 1024 tokens) = 1个累积æ¥éª¤ãå æ¤æ¯ä¸ªä¼å卿¥éª¤æ£å¥½æ¯æ¯ä¸ª rank è¿è¡ä¸æ¬¡åå/ååä¼ æï¼ç¶åæ§è¡ä¸æ¬¡ Gloo all-reduceã--num-iterations 10â ä» 10 个ä¼å卿¥éª¤ã纯粹çåçæµè¯ã--eval-every 5â å¨ç¬¬ 5 æ¥å第 10 æ¥è¿è¡éªè¯æå¤±ã--eval-tokens 2048â ä» å¯¹ 2,048 个 token è¿è¡è¯ä¼°ï¼ä¸ä¸ªå¾å°çéªè¯æ¹æ¬¡ï¼ã--core-metric-every -1â å®å ¨ç¦ç¨ CORE åºåè¯ä¼°ï¼-1= ä»ä¸ï¼ã对äºä¸ä¸ª 10 æ¥ç CPU è¿è¡æ¥è¯´ï¼å®è¿äºæè´µã--sample-every 10â å¨ç¬¬ 10 æ¥çæç¤ºä¾ææ¬ï¼ä»¥ä¾¿æ¨å¯ä»¥ç®æµè¾åºï¼å¨è¿ä¸ªè§æ¨¡ä¸ä¼æ¯è¡è¨ä¹±è¯ï¼ã--tracker noneâ ä¸ä½¿ç¨ wandb/æ¥å¿å端ã--run dist-cpu-2nodeâ è¿è¡åç§°ï¼ç¨äºæ£æ¥ç¹/æ¥å¿ç®å½å½åã
æç»´æ¨¡å
æ´ä¸ªå½ä»¤çå卿¯ä¸ºäºåçä¸ä¸ªé®é¢ï¼æç 2 èç¹ Gloo rendezvous 忢¯åº¦ all-reduce è½å¦å¨å±åç½å
å·¥ä½ï¼ æ¯ä¸ªæ¨¡åè¶
åæ°é½è¢«åç¼©å°æ¥è¿é¶ï¼æ·±åº¦ 4ï¼ç»´åº¦ 256ï¼10 æ¥ï¼ï¼å æ¤è¿è¡å¨å åéå
宿ï¼ä»»ä½å¤±è´¥é½æ¯ç½ç»é®é¢ï¼èé计ç®é®é¢ã䏿¦æå°åº OK 并䏿¥å¿æ¾ç¤ºä¸¤ä¸ª rank 忥åè¿ï¼æ¨å°±å¯ä»¥äº¤æ¢ --device-typeãIFNAME åç«¯åæ¨¡å大å°ï¼è¿è¡çæ£çè¿è¡ã
éè¦éªè¯çä¸ç¹ï¼rank 1 çå½ä»¤å¿
é¡»å¨ --nnodesã--master_addrã--master_portãæ»æ¹æ¬¡å¤§å°åæææ¨¡ååæ°ä¸å¹é
ââ torchrun ä¸ä¼æè·è¶
åæ°ä¸å¹é
çé®é¢ï¼è rank ä¹é´é
ç½®ä¸ä¸è´ä¼å¯¼è´éé»çå½¢ç¶é误æå¨ç¬¬ä¸æ¬¡éåéä¿¡æ¶æèµ·ã
