模智能體訓(xùn)練的基礎(chǔ)設(shè)施實踐)
1. 從跑得動到跑得穩(wěn)智能體訓(xùn)練為什么需要專門的沙箱層大模型智能體訓(xùn)練這件事真正上手做過的人都有一個共同感受模型本身的訓(xùn)練代碼其實不是最折磨人的部分最折磨人的是環(huán)境。你要讓成百上千個智能體實例同時跑起來每個實例都要能讀寫文件、執(zhí)行命令、調(diào)用工具、訪問網(wǎng)絡(luò)資源還要保證它們之間互不干擾、崩潰了能自動恢復(fù)、跑完能干凈回收。這套東西如果靠人工一臺臺機器去配基本等于自虐。DeepSeek 提出的 DSecDeepSeek Elastic Computing彈性計算就是沖著這個痛點去的。它的定位很明確一套面向大規(guī)模智能體訓(xùn)練的沙箱基礎(chǔ)設(shè)施。注意這里的三個關(guān)鍵詞——大規(guī)模、智能體訓(xùn)練、沙箱。這三個詞決定了它和普通的容器編排、普通的虛擬機管理完全不是一回事。先說大規(guī)模。智能體訓(xùn)練和傳統(tǒng)模型訓(xùn)練有個本質(zhì)區(qū)別傳統(tǒng)訓(xùn)練是數(shù)據(jù)并行、模型并行算力吃滿就行而智能體訓(xùn)練是環(huán)境并行每個智能體要在自己的環(huán)境里做決策、執(zhí)行動作、觀察反饋環(huán)境數(shù)量可能比 GPU 數(shù)量還多一個數(shù)量級。這就意味著沙箱的創(chuàng)建、銷毀、調(diào)度頻率極高傳統(tǒng)的申請一臺機器等五分鐘的模式根本扛不住。再說智能體訓(xùn)練。智能體不是跑一次就完事它要反復(fù)試錯。一個訓(xùn)練回合里同一個智能體可能要在沙箱里執(zhí)行幾十上百個動作中間任何一步環(huán)境出問題整個回合的數(shù)據(jù)就廢了。所以沙箱必須做到狀態(tài)可快照、可回滾、可復(fù)現(xiàn)。這一點和普通的 CI/CD 沙箱、代碼執(zhí)行沙箱有本質(zhì)區(qū)別。最后說沙箱。沙箱的核心訴求是隔離。但智能體訓(xùn)練的隔離需求和普通安全隔離還不太一樣——它既要防止智能體之間互相污染比如 A 智能體寫的文件被 B 讀到又要允許智能體在沙箱內(nèi)自由操作裝包、改配置、跑腳本。這個平衡點很難拿捏太嚴了智能體啥也干不了太松了訓(xùn)練數(shù)據(jù)就臟了。我個人的判斷是DSec 這類基礎(chǔ)設(shè)施的出現(xiàn)標(biāo)志著智能體訓(xùn)練正在從手工作坊階段進入工業(yè)化階段。早期大家用 Docker 起幾個容器、寫個腳本輪詢就湊合了但當(dāng)智能體數(shù)量上到幾千、訓(xùn)練任務(wù)跑到幾萬小時的時候沒有專門的沙箱層根本玩不轉(zhuǎn)。下面我會從架構(gòu)思路、核心機制、實操落地、踩坑經(jīng)驗幾個角度把這類系統(tǒng)拆開講清楚。2. DSec 的彈性計算底座調(diào)度、隔離與生命周期管理2.1 為什么彈性是智能體訓(xùn)練的第一性需求先解釋一下彈性計算在這里到底指什么。很多人第一反應(yīng)是云服務(wù)器那種按需擴縮容但在智能體訓(xùn)練場景里彈性的含義要具體得多。智能體訓(xùn)練的任務(wù)負載是脈沖式的。一個訓(xùn)練批次開始時可能需要瞬間拉起 2000 個沙箱訓(xùn)練過程中部分沙箱因為任務(wù)完成或失敗被回收數(shù)量降到 800下一批次又沖回 2500。這種波動如果靠預(yù)先分配固定資源要么浪費嚴重要么高峰期排隊等到天荒地老。DSec 的彈性體現(xiàn)在三個層面創(chuàng)建彈性沙箱從請求到可用目標(biāo)是在秒級完成而不是分鐘級。這要求底層不能走完整的虛擬機啟動流程必須用輕量級隔離方案。規(guī)格彈性不同智能體任務(wù)對資源的需求差異巨大。有的只需要 1 核 512MB 跑個 Python 腳本有的要 8 核 16GB 跑仿真環(huán)境。沙箱規(guī)格必須能按任務(wù)動態(tài)匹配。生命周期彈性沙箱不是創(chuàng)建了就一直在而是跟著訓(xùn)練回合走?;睾辖Y(jié)束立即回收回合中斷可以快照保留回合重跑可以基于快照恢復(fù)。我見過不少團隊一開始用 K8s 的 Job 來跑智能體結(jié)果發(fā)現(xiàn) Pod 啟動動輒十幾秒一個訓(xùn)練回合光等環(huán)境就耗掉大量時間。后來換成更輕的方案啟動時間壓到 1 秒以內(nèi)整體訓(xùn)練吞吐直接翻倍。這就是彈性底座的價值。2.2 隔離方案的選擇容器、微虛擬機還是進程級隔離方案是 DSec 這類系統(tǒng)的核心決策點沒有之一。我把它拆成三個選項來對比隔離方案啟動速度隔離強度資源開銷適用場景進程級隔離毫秒級弱極低純計算、無文件系統(tǒng)操作容器隔離百毫秒到秒級中低大多數(shù)智能體任務(wù)微虛擬機秒級強中需要內(nèi)核級隔離、跑不可信代碼DSec 這類系統(tǒng)通常會采用容器為主、微虛擬機為輔的混合策略。原因很實際絕大多數(shù)智能體任務(wù)寫代碼、調(diào) API、跑腳本用容器隔離就夠了namespace cgroup 能擋住絕大部分干擾但遇到需要跑用戶上傳的、完全不可信的二進制時容器隔離就不夠了得上升到微虛擬機級別。這里有個容易被忽略的細節(jié)容器隔離的隔離是有邊界的。默認的 Docker 容器共享內(nèi)核如果智能體在容器里執(zhí)行了某些特權(quán)操作理論上存在逃逸風(fēng)險。所以在智能體訓(xùn)練場景里通常會做幾件事加固禁用 privileged 模式drop 掉所有不必要的 capability掛載只讀根文件系統(tǒng)可寫目錄單獨掛 tmpfs 或獨立卷限制 seccomp 系統(tǒng)調(diào)用白名單網(wǎng)絡(luò)命名空間隔離默認無外網(wǎng)需要時按需放行提示如果你的智能體任務(wù)需要訪問外部 API不要圖省事直接給沙箱開全量網(wǎng)絡(luò)。正確做法是走一個受控的出口代理既能審計流量又能防止智能體把訓(xùn)練數(shù)據(jù)外傳。2.3 沙箱生命周期從創(chuàng)建到回收的完整鏈路一個沙箱的完整生命周期我把它拆成六個階段每個階段都有坑請求階段訓(xùn)練調(diào)度器發(fā)出沙箱請求帶上規(guī)格、鏡像、初始數(shù)據(jù)、超時時間。調(diào)度階段DSec 的調(diào)度器決定在哪個物理節(jié)點上創(chuàng)建沙箱。這里要考慮節(jié)點負載、鏡像緩存命中率、數(shù)據(jù)本地性。創(chuàng)建階段拉取鏡像或從緩存恢復(fù)、掛載卷、注入初始數(shù)據(jù)、啟動沙箱進程。運行階段智能體在沙箱內(nèi)執(zhí)行動作DSec 負責(zé)監(jiān)控資源使用、收集日志、處理超時。快照階段可選訓(xùn)練回合結(jié)束時把沙箱狀態(tài)快照下來用于后續(xù)復(fù)現(xiàn)或斷點續(xù)訓(xùn)。回收階段銷毀沙箱釋放資源清理臨時數(shù)據(jù)。這里面最容易被低估的是鏡像緩存。如果每個沙箱創(chuàng)建都要從遠端拉一個幾 GB 的鏡像那啟動時間根本壓不下來。實際做法是在每個物理節(jié)點上維護一個本地鏡像緩存常用鏡像預(yù)熱到本地創(chuàng)建時直接從本地 overlay 掛載。我實測過有本地緩存的情況下容器創(chuàng)建能壓到 300ms 以內(nèi)沒有緩存光拉鏡像就要 20 秒以上。另一個坑是快照的粒度。全量快照把整個文件系統(tǒng)打包太慢增量快照只記錄變化實現(xiàn)復(fù)雜。DSec 這類系統(tǒng)通常采用分層快照基礎(chǔ)鏡像層不動只快照可寫層的變化。這樣快照體積小、恢復(fù)快但要求可寫層和基礎(chǔ)層嚴格分離。3. 智能體訓(xùn)練場景下的沙箱特殊設(shè)計3.1 狀態(tài)可復(fù)現(xiàn)為什么重跑一次結(jié)果不一樣是致命的智能體訓(xùn)練和普通模型訓(xùn)練最大的區(qū)別之一是對可復(fù)現(xiàn)性的要求極高。原因很簡單強化學(xué)習(xí)類的訓(xùn)練獎勵信號是基于智能體的動作序列算出來的。如果同一個動作序列在不同沙箱里跑出不同結(jié)果那訓(xùn)練信號就是噪聲模型根本學(xué)不到東西。導(dǎo)致不可復(fù)現(xiàn)的因素有很多我列幾個最常見的時間戳和隨機種子智能體如果依賴系統(tǒng)時間或未固定的隨機數(shù)每次跑結(jié)果都不同。文件系統(tǒng)殘留上一個回合留下的臨時文件被下一個回合讀到。網(wǎng)絡(luò)狀態(tài)外部 API 的響應(yīng)時間、返回內(nèi)容波動。資源競爭沙箱之間搶 CPU、搶 IO導(dǎo)致超時行為不一致。DSec 這類系統(tǒng)解決這個問題的思路是環(huán)境快照 確定性注入。具體來說每個訓(xùn)練回合開始時從同一個基礎(chǔ)快照創(chuàng)建沙箱保證初始狀態(tài)一致。注入固定的隨機種子、固定的系統(tǒng)時間或時間偏移量。網(wǎng)絡(luò)訪問走 mock 層或錄制回放保證外部依賴確定。資源配額硬限制避免競爭導(dǎo)致的非確定性。注意完全的可復(fù)現(xiàn)是有代價的。如果你把網(wǎng)絡(luò)完全 mock 掉智能體就學(xué)不會處理真實網(wǎng)絡(luò)的不確定性。實際做法通常是訓(xùn)練早期用 mock 保證穩(wěn)定訓(xùn)練后期逐步放開真實網(wǎng)絡(luò)讓模型適應(yīng)真實環(huán)境。3.2 快照與回滾斷點續(xù)訓(xùn)和故障恢復(fù)的基石快照機制在智能體訓(xùn)練里的價值怎么強調(diào)都不過分。我舉兩個真實場景場景一長回合訓(xùn)練中斷。一個智能體任務(wù)要跑 2 小時跑到 1 小時 50 分的時候物理節(jié)點掛了。如果沒有快照這 1 小時 50 分的計算全廢如果有快照可以從最近的檢查點恢復(fù)只損失幾分鐘。場景二探索式訓(xùn)練。智能體在訓(xùn)練中會嘗試各種動作有些動作會導(dǎo)致環(huán)境進入死胡同。有了快照可以快速回滾到分叉點嘗試另一條路徑而不必從頭再來。DSec 的快照設(shè)計通常要考慮幾個維度快照頻率太頻繁影響性能太稀疏恢復(fù)代價大。常見做法是每 N 個動作或每 M 秒做一次增量快照??煺沾鎯Ρ镜乇P快但容量有限遠端存儲容量大但恢復(fù)慢。通常采用本地 遠端分層??煺找恢滦钥煺諘r如果有正在進行的寫操作要保證快照是某個一致的時間點不能是半寫狀態(tài)。實現(xiàn)上容器場景常用的是CRIUCheckpoint/Restore In Userspace或者文件系統(tǒng)級的快照如 overlayfs 的 lower/upper 分離。CRIU 能保存進程的完整內(nèi)存狀態(tài)恢復(fù)后進程從原地繼續(xù)跑但對內(nèi)核版本和進程類型有要求。文件系統(tǒng)級快照更通用但恢復(fù)后進程要重啟適合無狀態(tài)或狀態(tài)外置的任務(wù)。3.3 資源配額與超賣如何在有限硬件上跑更多智能體智能體訓(xùn)練的成本大頭是硬件。一臺 64 核 256GB 的機器如果每個沙箱獨占 4 核 16GB只能跑 16 個沙箱。但實際觀察下來智能體任務(wù)大部分時間在等 IO、等網(wǎng)絡(luò)、等思考CPU 利用率經(jīng)常不到 20%。這就給超賣留下了空間。DSec 這類系統(tǒng)通常支持資源超賣但超賣策略要精細CPU 超賣按 request 調(diào)度按 limit 限制。比如 request 1 核、limit 4 核物理機上可以塞 32 個這樣的沙箱但每個最多用 4 核。內(nèi)存不超賣或謹慎超賣內(nèi)存超賣風(fēng)險大一旦 OOM 會連鎖反應(yīng)。通常內(nèi)存按 request 分配留一定 buffer。IO 和網(wǎng)絡(luò)配額用 cgroup blkio 和 tc 限速防止單個沙箱把磁盤或帶寬打滿。我踩過的一個坑是早期為了塞更多沙箱把內(nèi)存也超賣了結(jié)果高峰期一批沙箱同時申請內(nèi)存觸發(fā) OOM Killer把關(guān)鍵進程殺了整個節(jié)點上的訓(xùn)練全崩。后來改成內(nèi)存不超賣、CPU 適度超賣穩(wěn)定性好了很多整體吞吐反而更高因為不用頻繁處理崩潰恢復(fù)。4. 落地實操把 DSec 思路用在自己的訓(xùn)練集群上4.1 環(huán)境準(zhǔn)備從零搭建一套最小可用沙箱系統(tǒng)假設(shè)你現(xiàn)在要自己搭一套類似 DSec 的沙箱系統(tǒng)我按最小可用版本給你梳理步驟。這套方案不依賴特定廠商用開源組件就能拼出來。第一步確定隔離方案。如果智能體任務(wù)都是自己寫的代碼用容器就夠。選 containerd 而不是 Docker daemon因為 containerd 更輕、更適合被程序調(diào)用。第二步選調(diào)度層。小規(guī)模幾十節(jié)點以內(nèi)用 Nomad 就夠比 K8s 輕很多。大規(guī)模再上 K8s但要關(guān)掉一堆用不上的組件。第三步搭鏡像緩存。在每個節(jié)點上跑一個鏡像預(yù)熱服務(wù)把常用鏡像提前拉下來??梢杂?dragonfly 或自己寫個簡單的 rsync 同步。第四步實現(xiàn)沙箱管理 API。核心接口就幾個create、exec、snapshot、destroy。用 gRPC 暴露訓(xùn)練調(diào)度器直接調(diào)。第五步接監(jiān)控。每個沙箱的資源使用、生命周期事件都要上報否則出了問題根本查不到。下面是一個用 containerd 創(chuàng)建沙箱的簡化示例Go 偽代碼展示核心邏輯// 創(chuàng)建沙箱的核心流程 func CreateSandbox(ctx context.Context, spec SandboxSpec) (*Sandbox, error) { // 1. 從本地鏡像緩存解析鏡像 image, err : imageStore.Resolve(ctx, spec.Image) if err ! nil { return nil, fmt.Errorf(resolve image: %w, err) } // 2. 創(chuàng)建容器快照overlayfs 可寫層 snapshotKey : fmt.Sprintf(sandbox-%s, spec.ID) snapshot, err : snapshotter.Prepare(ctx, snapshotKey, image.Target) if err ! nil { return nil, fmt.Errorf(prepare snapshot: %w, err) } // 3. 配置容器 spec資源限制、網(wǎng)絡(luò)、掛載 containerSpec : buildContainerSpec(spec, snapshot) // 4. 創(chuàng)建并啟動容器 container, err : client.NewContainer(ctx, spec.ID, containerd.WithSnapshotter(overlayfs), containerd.WithNewSnapshot(snapshotKey, image), containerd.WithNewSpec(containerSpec), ) if err ! nil { return nil, fmt.Errorf(create container: %w, err) } task, err : container.NewTask(ctx, cio.NewCreator(cio.WithStdio)) if err ! nil { return nil, fmt.Errorf(new task: %w, err) } // 5. 啟動 if err : task.Start(ctx); err ! nil { return nil, fmt.Errorf(start task: %w, err) } return Sandbox{ID: spec.ID, Container: container, Task: task}, nil }這段代碼的關(guān)鍵點在于快照先于容器創(chuàng)建。overlayfs 的 Prepare 操作只是建立可寫層的元數(shù)據(jù)非常快真正的數(shù)據(jù)拷貝是懶加載的。這就是為什么容器能秒級啟動。4.2 訓(xùn)練任務(wù)如何與沙箱系統(tǒng)對接沙箱系統(tǒng)搭好了接下來是訓(xùn)練側(cè)怎么用。這里有個架構(gòu)選擇訓(xùn)練進程和沙箱是同一個進程還是分離的。同進程模式訓(xùn)練代碼直接在沙箱里跑沙箱就是訓(xùn)練環(huán)境。簡單但沙箱掛了訓(xùn)練就掛了。分離模式訓(xùn)練進程在沙箱外通過 API 控制沙箱內(nèi)的智能體。復(fù)雜但容錯性好。大規(guī)模訓(xùn)練基本都選分離模式。訓(xùn)練調(diào)度器維護一個沙箱池每個訓(xùn)練回合從池里取一個沙箱注入任務(wù)等結(jié)果回收沙箱。這樣沙箱崩潰不影響調(diào)度器調(diào)度器可以重新分配。對接的核心接口設(shè)計# 訓(xùn)練側(cè)調(diào)用沙箱的典型流程 class AgentTrainer: def __init__(self, sandbox_client): self.client sandbox_client def run_episode(self, agent, task): # 1. 申請沙箱 sandbox self.client.create( imageagent-env:latest, cpu2, memory4Gi, timeout3600, snapshot_frombase-snapshot-v3 # 從固定快照啟動保證可復(fù)現(xiàn) ) try: # 2. 注入任務(wù)初始狀態(tài) sandbox.write_file(/task/init.json, task.to_json()) sandbox.exec(python /task/setup.py) # 3. 循環(huán)執(zhí)行動作 for step in range(task.max_steps): action agent.act(sandbox.observe()) result sandbox.exec(action.command, timeoutaction.timeout) reward task.compute_reward(result) agent.learn(action, result, reward) if task.is_done(result): break # 4. 保存回合數(shù)據(jù) trajectory sandbox.read_file(/task/trajectory.jsonl) return trajectory finally: # 5. 無論成功失敗都回收 self.client.destroy(sandbox.id)這里有個細節(jié)值得說快照來源要固定。snapshot_frombase-snapshot-v3這行保證了每個回合的初始環(huán)境完全一致。如果每次都用最新鏡像鏡像一更新歷史回合就復(fù)現(xiàn)不了了。4.3 性能調(diào)優(yōu)把沙箱啟動時間從 10 秒壓到 1 秒啟動時間是沙箱系統(tǒng)的核心指標(biāo)。我按優(yōu)化收益從高到低排個序優(yōu)化手段收益實現(xiàn)難度備注本地鏡像緩存極大低必做收益最高懶加載文件系統(tǒng)大中overlayfs 天然支持預(yù)熱沙箱池大中提前創(chuàng)建好待用精簡鏡像中低去掉不必要的層并行創(chuàng)建中低批量創(chuàng)建時并行內(nèi)核參數(shù)調(diào)優(yōu)小高邊際收益遞減預(yù)熱沙箱池這個手段特別值得展開說。思路很簡單與其等訓(xùn)練任務(wù)來了再創(chuàng)建沙箱不如提前創(chuàng)建一批空閑沙箱放在池子里。訓(xùn)練任務(wù)來了直接從池里取取完立即補充。這樣訓(xùn)練側(cè)感知到的創(chuàng)建時間接近零。池子大小的設(shè)置是個權(quán)衡池子太小高峰期不夠用池子太大空閑沙箱占資源。經(jīng)驗值是按歷史峰值的 1.2 倍設(shè)置同時監(jiān)控池子的命中率命中率低于 80% 就擴容。提示預(yù)熱沙箱要注意新鮮度。池子里的沙箱放久了可能掛載的卷過期、token 失效。建議給池子里的沙箱設(shè)置最大空閑時間超時自動重建。5. 踩坑實錄那些文檔里不會寫的教訓(xùn)5.1 文件描述符泄漏跑幾小時后沙箱集體卡死這個問題我印象極深。系統(tǒng)上線初期跑得好好的但每次跑到 4-5 小時就有一批沙箱集體卡死新命令執(zhí)行不了日志也不輸出。排查過程是這樣的先看監(jiān)控發(fā)現(xiàn)卡死沙箱所在節(jié)點的file-nr指標(biāo)飆升到上限。進節(jié)點看lsof發(fā)現(xiàn)大量匿名管道和 socket 沒關(guān)閉。定位到沙箱管理進程發(fā)現(xiàn)每次 exec 命令都會創(chuàng)建一個管道用于捕獲輸出但異常路徑下沒關(guān)閉。修復(fù)所有管道創(chuàng)建后立即 defer close異常路徑也要走 close。這個坑的教訓(xùn)是沙箱系統(tǒng)是長跑型服務(wù)任何資源泄漏都會累積。文件描述符、內(nèi)存、臨時文件、網(wǎng)絡(luò)連接每一樣都要有明確的釋放路徑。建議在開發(fā)階段就加上資源泄漏檢測比如定期 dump 進程的 fd 數(shù)量超過閾值告警。5.2 快照恢復(fù)后的時鐘漂移訓(xùn)練信號全亂套另一個坑和快照有關(guān)。我們做斷點續(xù)訓(xùn)時從快照恢復(fù)沙箱結(jié)果發(fā)現(xiàn)恢復(fù)后的智能體行為異常獎勵信號完全對不上。查了半天發(fā)現(xiàn)是時鐘問題??煺毡4娴氖悄硞€時間點的狀態(tài)恢復(fù)后沙箱內(nèi)的系統(tǒng)時鐘還是快照時的時間但外部世界已經(jīng)過了幾小時。智能體代碼里有基于時間的邏輯比如距離任務(wù)開始超過 30 分鐘就放棄恢復(fù)后這個邏輯直接誤判。解決方案有兩個恢復(fù)時同步時鐘從快照恢復(fù)后立即把沙箱內(nèi)時鐘同步到當(dāng)前時間。但這會破壞可復(fù)現(xiàn)性。虛擬時鐘沙箱內(nèi)使用虛擬時鐘從快照的時間點繼續(xù)走與外部時鐘解耦。這樣可復(fù)現(xiàn)性保住了但需要智能體代碼配合使用虛擬時鐘。我們最終選了虛擬時鐘方案因為可復(fù)現(xiàn)性對訓(xùn)練太重要了。代價是要改智能體代碼把所有time.time()換成沙箱提供的虛擬時鐘接口。5.3 網(wǎng)絡(luò)隔離的漏網(wǎng)之魚智能體偷偷訪問了外部這個坑比較隱蔽。我們給沙箱配了網(wǎng)絡(luò)隔離默認無外網(wǎng)。但測試時發(fā)現(xiàn)某些智能體居然能訪問到外部服務(wù)。排查發(fā)現(xiàn)隔離只做了出站流量的 iptables 規(guī)則但沒禁用 IPv6。智能體通過 IPv6 繞過了 IPv4 的隔離規(guī)則。另外DNS 解析也沒限制智能體可以通過 DNS 查詢外傳數(shù)據(jù)。修復(fù)清單iptables 規(guī)則同時覆蓋 IPv4 和 IPv6禁用沙箱內(nèi)的 IPv6除非明確需要DNS 走內(nèi)部解析器禁止直接訪問外部 DNS定期做滲透測試驗證隔離有效性注意網(wǎng)絡(luò)隔離不是配一次就完事。內(nèi)核更新、容器運行時更新都可能改變默認行為。建議把隔離驗證做成自動化測試每次環(huán)境變更后跑一遍。5.4 鏡像層的幽靈文件刪了還在占了空間overlayfs 有個特性在可寫層刪除一個基礎(chǔ)層的文件實際是在可寫層創(chuàng)建一個 whiteout 文件基礎(chǔ)層的文件還在。如果智能體頻繁創(chuàng)建和刪除大文件可寫層會越來越大但du看到的可能不準(zhǔn)。我們遇到過節(jié)點磁盤滿但du統(tǒng)計的沙箱占用加起來遠小于磁盤容量。原因就是大量 whiteout 文件和已刪除但被進程持有的文件。解決辦法定期對沙箱可寫層做 compaction把 whiteout 合并掉監(jiān)控節(jié)點的實際磁盤使用而不是沙箱占用之和對沙箱可寫層設(shè)置大小上限超了直接殺掉重建6. 從 DSec 看智能體訓(xùn)練基礎(chǔ)設(shè)施的演進方向把 DSec 這類系統(tǒng)放在更大的背景下看它代表了一個趨勢智能體訓(xùn)練正在從算法問題變成系統(tǒng)工程問題。早期做智能體大家關(guān)注的是算法——怎么設(shè)計獎勵函數(shù)、怎么優(yōu)化探索策略。現(xiàn)在算法框架基本收斂了瓶頸轉(zhuǎn)移到了基礎(chǔ)設(shè)施怎么在有限硬件上跑更多環(huán)境、怎么保證訓(xùn)練穩(wěn)定、怎么降低單次實驗的成本。這個趨勢對從業(yè)者的能力要求也變了。以前做智能體訓(xùn)練會寫 PyTorch 就行現(xiàn)在還得懂容器、懂調(diào)度、懂網(wǎng)絡(luò)隔離、懂存儲。我個人的體會是基礎(chǔ)設(shè)施能力正在成為智能體團隊的護城河。算法可以看論文復(fù)現(xiàn)但一套穩(wěn)定高效的沙箱系統(tǒng)是踩了無數(shù)坑、迭代了無數(shù)版才磨出來的這個很難抄。往后看我覺得有幾個方向值得關(guān)注沙箱的標(biāo)準(zhǔn)化現(xiàn)在每家都在自己造輪子未來可能出現(xiàn)類似 OCI 的沙箱標(biāo)準(zhǔn)讓沙箱鏡像和運行時可以跨平臺復(fù)用。硬件加速的隔離隨著機密計算如 Intel TDX、AMD SEV成熟沙箱隔離可能下沉到硬件層既快又安全。訓(xùn)練與推理的統(tǒng)一沙箱現(xiàn)在訓(xùn)練和推理用的是兩套環(huán)境未來可能統(tǒng)一讓訓(xùn)練好的智能體無縫部署到生產(chǎn)沙箱。最后分享一個我在實際項目中的小技巧給每個沙箱打上完整的元數(shù)據(jù)標(biāo)簽包括訓(xùn)練任務(wù) ID、回合 ID、鏡像版本、快照來源、創(chuàng)建時間。這些標(biāo)簽在排查問題時價值巨大——當(dāng)某個訓(xùn)練批次出現(xiàn)異常你可以快速篩出這批沙箱對比它們的標(biāo)簽差異往往一眼就能定位到是鏡像問題還是快照問題。這個習(xí)慣幫我省了無數(shù)排查時間強烈建議你也加上。