Day 05:工程基礎最小集合——環境、Git、容器、金鑰
「在我電腦上明明跑得起來啊。」
這句熟悉的對話日常,在 ML 系統會是場災難,因為 ML 多了兩個變數:資料與模型權重。第一部曲我們將 AI 職缺目前在市場的需求進行說明,第二部曲聚焦在地基,今天要做的,就是降低只能回答出「在我電腦上明明可以」的風險。
今天要解決的問題
以下三個問題都很常見:環境、版控與金鑰,不處理會卡住:
問題一:環 境不可重現。 去年執行 pip install pandas 裝到的是 2.x,今天重新建立環境可能已經裝到 3.x。同一份程式碼、一樣呼叫 groupby(),光是套件預設行為改變,輸出就可能不同。程式碼能重跑,不代表結果能重現。 [註1]
問題二:Git 用得太感人。 把 500MB 的模型檔 commit 進去、把 data/ 整包推上 GitHub、或更糟——把 .env 推上去了。
問題三:金鑰外洩。 這件事沒有「小心一點就好」,因為 GitHub 是被機器人 24 小時掃描的。推上去的那一刻就要當作已經外洩,改密碼是唯一解,刪 commit 沒有用。
📊 職缺訊號
這篇對應的不是單一任務訊號,而是所有任務的前提。來自 4,343 職缺之中梳理了實際的數字:MLOps 職缺中 58.5% 提到平臺與基礎設施、42.6% 提到訓練管線與 CI/CD,這兩件事都建立在「環境可重現」之上。
一、現象:三個你一定遇過的坑
坑一:requirements.txt 沒有鎖版本。
pandas
scikit-learn
正確做法是鎖住版本,並區分「直接依賴」與「完整鎖定」,專案實際主動使用的套件、間接相依套件版本鎖住,確保不同時間、不同機器都能建立出一致的執行環境。
坑二:Dockerfile 分層順序寫反。 這個坑不會讓你的程式出錯,只會默默偷走你的時間:

圖 5-1:Dockerfile 分層順序對重建時間的影響(依 Docker 快取失效規則推算的示範值)。左圖是單次重建,右圖是一天 30 次建置的累積差距,約 48 分鐘。
原理是 Docker 的逐層快取:任何一層變動,其後所有層的快取全部失效。如果你寫 COPY . /app 再 RUN pip install,那麼改一行程式碼就會讓依賴安裝層失效,每次都重裝一次。
坑三:金鑰進了版本控制。 反覆提醒自己:程式碼裡永遠不出現金鑰字串。
二、原理:可重現=程式碼+依賴+系統+資料+種子
「環境」不只是套件。一個 ML 工作可重現,需要五件事同時被固定:
| 要素 | 用什麼固定 | 沒固定會怎樣 |
|---|---|---|
