2026年7月6日 星期一

創建一部 aws 短命 ec2 主機, 省錢玩 AI

AWS 的 ec2 服務, 如果要玩 AI, 就需要選比較強的虛擬主機, 尤其因為有 GPU, 當然也就比較貴 💸。 大部分時候, 直接拿別人包好的 docker 來玩比較方便, 而且還要設定讓 docker 支援 GPU。 但我只是久久才偶爾開來玩一次, 要怎樣才能省錢?

以下假設你已玩過 AWS 的 ec2。 [教學一教學二教學三] AWS 較高階的 ec2 instance 附贈 instance store, 是位於同一主機的一顆 (或數顆) nvme 硬碟, 具有三大特性: 僅供暫存、 快速、 免費。 根據 官方資料, (我們將選用的) g4dn.xlarge 這種機型附有一顆 125G 這樣的 instance store (以下簡稱 IS) 這就是幫助我們省錢的重點了。

不堅持要求固定 IP 的話, 最大的花費是開機運作, 我們的機型的費用是每小時 0.526 美金; 其次是 EBS 硬碟, 每月每 GB 0.08 美金。 所以規劃兩種運作模式:

  1. 研究模式: 玩新的模型, 需要花時間研究 => 連續幾天使用內建 EBS + 外掛 EBS 硬碟, 暫時不用則關機不拆機, 硬碟持續付費。 幾天實驗結束後再拆機。 (terminate)
  2. 應用模式: 把流程已固定的熟悉模型拿出來工作 => 建立機器, 僅用內建 EBS + IS, 工作完就立即拆掉。 (terminate)

以下就來談比較省錢、 比較不好用的「應用模式」。 切記: 盡量把好幾項工作批次集中在同一次開機當中完成; 如果 reboot, IS 裡的資料還在, 且 IP 不變; 但如果關機 (stop) 再重開 (start), IS 裡的資料就清空了, IP 也變了。 所以等一下要選取 「已把 GPU 驅動程式以及 docker.io 套件包裝進去的」 OS Image, 可以省掉一些步驟。 但是有興趣的 docker image 還是每次都需要重新抓取, container 也需要重建 ==> 採用 「User data」 功能簡化手動步驟。

我參考 gemini 的推薦, 選擇以下:

  1. Application and OS Image: 在對話框裡搜尋 "dlami" (Deep Learning AMI) 或 "deep learning"。 一般會選擇 "Deep Learning Base AMI with Single CUDA (Amazon Linux 2023)"; 但那個環境跟 fedora 比較接近, 而我偏好 debian 環境, 所以我選 "Deep Learning Base AMI with Single CUDA (Ubuntu 24.04)" (x86 版)。
  2. Instance type: g4dn.xlarge (玩 AI 的基本款?)
  3. 硬碟空間: 採用預設即可, Amazon Linux 需要 30G, ubuntu 需要 35G。
  4. 然後打開 Advanced details, 拉到最下面 "User data", 把 這個初始設定 複製貼上, 修改一下。

User data 初始設定做了以下的事:

  1. "set -e" 設定: 如果這個 script 當中任何一步出錯, 就直接中斷結束, 略過後面所有動作。 例如要避免這樣的狀況: 浪費很多時間做 docker pull, 最後卻把 / 塞爆, 而不是正確地放在閒閒的 IS。
  2. 設定最基本的正體中文環境, 至少可以在命令列上打字跟顯示中文。 但錯誤訊息還是用英文, 比較方便搜尋。
  3. 設定快速連結 /gym 指向 IS 儲存區。 其中 /opt/dlami/nvme 是 AWS 的 ubuntu 映像檔會自動把 IS 掛載上來的掛載點。 如果當初選的是 Amazon linux, 就需要手動掛載, 詳見註解。
  4. 安裝一些常用套件。
  5. 設定主機名稱。 但是這要 reboot 之後才會生效。
  6. 這是我自己常用的 /root/.vimrc 跟 /root/.inputrc 等等。 請改成你自己的設定。
  7. 停用 docker 跟 containerd、 把它們儲存龐大映像檔的位置改指向 IS、 再重新啟動這兩個服務。 根據 官網說明, 較新的 docker 並不自己儲存映像檔, 而是採用 containerd 作為後端。 這樣一來, 空間有限的 root file system 就不至於被塞爆。
  8. 測試下載一個超過 20G 的映像檔。 <== 建議第一次先省略。

建立好雲端主機之後, 就登入測試。 Amazon Linux 的 login id: ec2-user; Ubuntu Linux 的 login id: ubuntu; 詳見 官方文件

第一次測試, 有可能會發現 "user data" 的 script 並沒有成功完全執行。 這時可以查看 /var/log/cloud-init-output.log 看看哪裡出了問題。 如果 script 根本沒有執行的跡象, 那就檢查 /var/log/cloud-init.log 。

我先手動測試下載一個很大的映像檔 onerahmet/openai-whisper-asr-webservice:latest-gpu, 需要將近三分鐘。 後來改成在 user data 裡面自動下載, 開機後沒有等很久即可登入, 但 docker images 隔了幾分鐘之後才看到那個映像檔。

曾想要把這個暫存分割區封存、 丟到 S3, 這樣下次開機或建立新機時就可以直接下載回來用, 不過光是封存就花很多時間, 好像不如乾脆每次開機都重新 docker pull ...

如果是 「研究模式」 那麼創建機器時就多加一顆 EBS 硬碟, 改拿它來掛載、 儲存映像檔, 也就不需要每次開機都重新 docker pull ... 了。 用完就趕快把昂貴的 g4dn.xlarge 關機。 手機設定鬧鐘, 如果幾天後沒有想要再玩, 到時就把這部機器給拆了, 以免硬碟繼續計價。

以上就是很少動手玩 AI 的退休人士的省錢筆記, 希望對你有幫助。

沒有留言:

張貼留言

因為垃圾留言太多,現在改為審核後才發佈,請耐心等候一兩天。