## Jubo給出的提示: ![image](https://hackmd.io/_uploads/Bk-Du3_7C.png) - Dockerfile (圖片中是Dockerfile.app 我不知道差別) 把環境建立到本機的主要檔案,我們接下來的 docker build就是要靠他 - cloudbuild-app.yaml 如果今天使用GCP, AWS等網路運算資源,就要用這個檔案來配合該服務建立工作環境 (例如google有他專屬的 google-builders) - requirements.txt 由於我們可能會用到很多pip install (langchain & transformer體系很難縮減packages 數量),為求健康平穩,還是應該建立一個requirements.txt讓有用到的package一覽無遺 - ***對於每一個Repo,每一個獨立的小實驗,甚至每一個獨立的版本,都可以有自己的***docker ## docker file 格式 (寫作範例) 先看到這個範例 FROM python:3.12-slim WORKDIR /app COPY requirements.txt ./ RUN pip install --no-cache-dir -r requirements.txt COPY . . - FROM python - 3.12-slim: docker 會從 [docker hub](https://hub.docker.com/_/python) 找到3.12-slim的環境,並以此作為這個工作環境的基底 - WORKDIR /app - 類似於 cd /app 的效果,接下來的指令會在 /app 裡面執行 - copy requirements.txt ./ - 把requirements.txt 拉到/app裡面,方便等等做安裝 - 這裡可能會注意到 requirements.txt 的位置不應該在 ./ (/app) 裡面,但仍然可以做這個copy,原因是因為docker有所謂的上下文建構,讓你可以從實際環境把檔案移動到docker的環境內,例如: docker build -t nexgen-database:1.0 . - 代表現在要build一個image,名字叫 nexgen-database:1.0,並將建構上下文的路徑設定為當前路徑( ./ ) - 由於docker build的時候image name通常是自己取的,這邊可以參考一下取名的規則,通常docker image name會遵循這幾條規則 - 全部小寫英文字母 - 接受 破折號、冒號、數字、跟偶爾的底線(不建議) - 建議在image name順便做好版本維護 - nexgen-database:1.0 就是一個可以參考的範例 - RUN pip install --no-cache-dir -r requirements.txt - 把 requirements.txt 裡面的 packages 全部裝起來 - COPY . . - 把專案中的所有東西 (通常就是code data本身) 都複製到 現在選定的WORKDIR裡面 ## docker file 使用範例 (以windows為例) - 如果你是使用 Linux or Unix(MAC),可以參考 [docker 入門教學](https://azole.medium.com/docker-container-%E5%9F%BA%E7%A4%8E%E5%85%A5%E9%96%80%E7%AF%87-1-3cb8876f2b14),教學寫得很詳盡,也有很多進階攻略 (可以點進去找),但入門的開發環境是node體系,所以學懂之後還需要做一下轉換 - [Windows Docker 下載](https://www.docker.com/products/docker-desktop/) 先到這裡下載,在經驗不多的時候有個desktop UI環境比較不會混淆 - ![image](https://hackmd.io/_uploads/H1zJ22OQA.png) - 安裝好並重開機之後,可以開個cmd輸入 docker -v 確認一下安裝完成,也有看到docker版本,並打開docker desktop登入 - git clone 專案 (或是下載別人傳的專案,隨便) - 移動到dockerfile所在的路徑 - 取一個喜歡的image name,把docker build起來 docker build -t nexgen-database:1.0 . - 接下來就是把環境 run 起來 docker run -d -p 5000:5000 nexgen-database:1.0 - docker run 就是 run docker 的意思 - -d 代表detached,確保獨立運行 - -p 5000:5000 p for port,前後的5000分別代表host port / container port,我還不確定完整的解釋,但透過這個備註就可以讓docker被掛在port 5000上,也意味著如果未來我們寫了 langserve / flask 這種call api形式的專案,就可以從 http://localhost:5000 跟專案開心互動 - 在製作Dockerfile時,如果想把它會serve的port講清楚的話,可以多加一行指令來指定 EXPOSE 5000 - 圖片範例 (跑了一小時多一點) - ![image](https://hackmd.io/_uploads/SJj441YmA.png) - 圖中我 -t 後面的docker名稱取錯了,用到docker tag / docker images / docker rmi 分別進行 改名/檢查/刪除,解決了小小危機 - 注意事項 - docker desktop好像要開著才不會出錯 - 如果cmd跑指令有error,就用管理員權限 or powershell試試看 ## 建立一個"Database建立實驗"的docker的實驗 - 其實最主要的環節就是把requirements.txt會用到的packages建好,其他都是按照範例抄下來就好 - 緊急偷懶招式 - 在寫完程式才發現要建docker的時候用 - 只在真的很小的實驗而且很緊急的時候用 - 最好是有用virtual environment,裡面沒有跟這個專案無關的東西 pip freeze > requirements.txt - 這行指令可以把目前pip list所有的套件直接輸出成requirements.txt - 健康招式 - 分析會用到的工具們 - 腦袋裡先想一下實驗內容,程式會怎麼跑 - 不擅長分析的朋友們,雖然可以程式寫完再來處理docker file,仍然可以做這個大綱模擬的練習提升實驗的可控性 - 由於我在真的build之前就列出大綱,提早注意到了torch + cuda的問題,如果已經洗臉做下去了可能會非常痛苦,也可能導致寫完程式後建了docker卻發現程式沒有正常運作了 從本地讀檔案,得到資料 把資料分成一條一條 (原本就是一條一條的話跳過) 把資料 Embedding: 會用到transformers 把資料放進資料庫: 會用到Faiss & Langchain 對資料庫做一些實驗 相似度查詢 (Similarity Search) 詢問查詢 (Retriever) (想像可以直接對資料庫內提問) - 把流程中會用到的套件整理出來 langchain faiss-cpu transformers torch - 然後就會發現一個問題: torch + cuda怎麼建立在docker內? - 平常是下載cuda > 安裝對應的torch + cuda版本 docker該怎麼做到這件事呢? - 從 [torch + cuda docker image](https://hub.docker.com/layers/pytorch/pytorch/2.3.0-cuda12.1-cudnn8-runtime/images/sha256-0279f7aa29974bf64e61d0ff6e979b41a249b3662a46e30778dbf80b8c99c361) 出發,在這上面安裝python, pip, curl, git,並upgrade pip (感謝Tony哥的建議!) FROM pytorch/pytorch:2.3.0-cuda12.1-cudnn8-runtime RUN apt-get update RUN apt-get install -y python3-pip curl git RUN pip3 install --upgrade pip ... (原本Dockerfile的流程 繼續下去) - 把Dockerfile跟requirements.txt分別建立 - build docker! docker build -t nexgen-database:1.0 . - 把docker跑起來看看,要記得加上 --gpus all 來確保 gpu 能被 docker 使用 docker run --gpus all -it nexgen-database:1.0 docker run --gpus all -it --rm nexgen-database:1.0 /bin/bash (自動清cache) docker run --gpus all -it --rm -p 5000:5000 nexgen-database:1.0 /bin/bash -c "python3 -c 'import torch; torch.cuda.empty_cache()' && bash" - 測試一下環境正不正常 把套件都import跑跑看,版本印印看,該檢查的東西(例如cuda available)檢查一下 - ![image](https://hackmd.io/_uploads/H1LuP1tQR.png) - 開心做實驗,過程中有額外做安裝或其他動作的話記得在requirements或dockerfile做編輯 - 如果環境需要比較大幅度的變動,可以更改好dockerfile & requirements後直接docker build一個新的version (例如 docker run --gpus all -i nexgen-database:1.1)