Conda + JuiceFS :增強 AI 開發環境共享能力

JuiceFS發表於2024-12-06

Conda 是當前 AI 應用開發領域中非常流行的環境和包管理系統,因其能夠簡單便捷地建立與系統資源相隔離的虛擬環境廣受歡迎。

Conda 支援在不同的作業系統上重建相同的工作環境,但在環境共享複用方面仍存在一些挑戰。比如,在不同機器上覆用相同環境需手動執行多步驟,過程中可能出現依賴不一致的問題。其次,維護多個環境版本並保持同步對快速迭代的專案,操作起來較為繁瑣。

作為一個雲原生分散式檔案系統,JuiceFS 極大地簡化了資料和環境的共享過程。開發人員可以將 Conda 環境儲存在 JuiceFS,實現環境配置的共享和實時訪問。JuiceFS 的跨平臺相容性在多作業系統和雲環境之間提供了無縫的資料共享能力,支援複雜的多平臺開發需求。
本文將從 Conda 的基本用法開始,一步步為您介紹 Conda 虛擬環境的常用共享方法、存在的問題,以及如何應用 JuiceFS 讓環境共享變簡單。

Conda 的基本用法

Conda 提供了兩個主要版本:一個是預裝了大量資料科學和機器學習庫的 Anaconda,另一個是更簡潔的 Miniconda,僅包含基本的 Python 和 Conda 環境管理工具。

Conda 是開源的跨平臺工具,支援在 Linux、Mac 和 Windows 系統上執行。各作業系統的安裝方式略有不同,關於 Miniconda 或 Anaconda 的安裝細節,請讀者參考其官方文件,本文不再贅述。

1. 檢視虛擬環境

預設情況下,Conda 會將新虛擬環境的相關資料儲存在它的安裝目錄,可以使用 conda env list 檢視詳情。如下圖,是 Linux 系統中內建的 base 虛擬環境的儲存路徑。

2. 建立虛擬環境

使用 create 命令建立新虛擬環境,如下圖,建立了一個名為 myrag 的虛擬環境。執行命令會有一個提示,確認後瞬間就能完成虛擬環境的建立。

可以看到,新的虛擬環境會儲存在 miniconda 的 $base/envs/ 目錄中。

3. 啟用虛擬環境

使用 activate 可以啟用一個虛擬環境,如下圖。啟用的虛擬環境會有一個 * 標識,終端提示符前面也有虛擬環境的名稱。

4. 基本使用

啟用虛擬環境以後,利用 conda install 可以安裝 Anaconda 倉庫中提供的各種包和庫。比如,在 myrag 虛擬環境中,當前的 python 版本是 3.12.3。

執行命令安裝 conda-forge::python

Python 版本就替換成了 3.13.0

同樣的,可以在虛擬環境中安裝特定版本的 NodeJS、Rust、Golang、Java 等。透過 conda install 命令安裝的包全都儲存在虛擬目錄中,它與作業系統的是隔離的,安裝的包互不影響。

5. 退出虛擬環境

執行 conda deactivate 命令即可退出虛擬環境

虛擬環境複用的挑戰

現代開發環境通常複雜且多樣化,不僅涉及團隊協作中的多人多機情況,每位開發者也可能同時維護多個開發環境。如果在一臺裝置上配置好的開發環境能夠便捷地在其他裝置上覆用,這將大大節省開發者的時間和精力,同時有效避免因單獨配置環境而導致的版本不統一等問題。

一般而言,Conda 的環境有以下幾種共享方法:

  1. environment.yml 配置檔案共享;
  2. conda-pack 工具打包;
  3. 直接共享虛擬目錄。

方法一:配置檔案共享

這種方法是將現有環境中配置、已安裝的包、依賴關係、路徑等資訊匯出到 environment.yml 配置檔案,然後根據這個配置檔案在其他裝置上重建虛擬環境。

# 匯出配置好的環境配置
conda env export > environment.yml

把配置檔案複製到目標裝置並據此重建虛擬環境:

# 使用配置檔案建立虛擬環境
conda env create -f environment.yml

這是 Conda 官方推薦的環境共享方式,它的優勢在於可以跨系統、跨架構,因為它共享的是材料清單(而不是材料),在目標裝置上只要照著清單安裝所需的資源即可。但這種方式對安裝了大量包的環境不太友好,需要目標裝置重複下載資源,如果網路環境不好的話,難免要多花些時間。

方法二:使用打包工具

這種方法是使用專門的工具來打包虛擬環境,把它所有東西都裝到一個壓縮包裡,這樣在目標裝置上解壓就能使用。

# 需要安裝 conda-pack 程式
conda install conda-pack

# 打包當前環境
conda pack -n xxx

conda-pack 會將虛擬環境打包成一個 tar.gz 壓縮包,複製到目標裝置,解壓即可直接使用。

這種方法可以彌補第一種方法的不足,對於安裝了特別多包的環境,複用的效率會更高。但它也存在一些不足,比如環境的變化無法在多臺裝置之間實時同步。

另外,如果虛擬環境中包含 pip 或 setup.py 安裝的包(editable packages),那麼它就無法打包這個虛擬環境。

方法三:直接共享虛擬目錄

這種方式是直接把 conda 虛擬目錄複製或共享給其他裝置使用,相比之下,這是三種方式當中最簡單直接的虛擬環境共享方法。但它的侷限和缺點也很明顯,因為虛擬環境中的某些檔案可能包含硬編碼的路徑資訊,在不同裝置上可能是不同的,這就會導致環境無法正常工作。因此這種方法要求共享使用的裝置有相同的 CPU 架構和作業系統。

上述複用虛擬環境的方法各有利弊和適合的場景,難說孰優孰劣。但可以確定的是,想要高效的複用環境,離不開一個可靠的資料共享方案。

特別是像 AI 應用這類日新月異變化的專案,開發環境的一致性和高效協作尤為重要,當機器數量很多,而且環境中的資源經常發生變化,且要求全部使用一致的虛擬環境時,就需要引入像 JuiceFS 這樣能夠便捷提供多裝置資料共享能力的專業工具來滿足需求。

用 JuiceFS 託管 Conda 虛擬環境

JuiceFS 是雲原生的分散式檔案系統,利用物件儲存作為底層資料儲存,並透過獨立的資料庫管理後設資料。這種獨特的架構設計,使得分佈在不同雲端、不同區域的 JuiceFS 客戶端能夠高效地共享和讀寫同一份資料。JuiceFS 提供了資料一致性保障,並結合完善的快取技術,實現資料的可靠儲存和高速訪問。特別是對可靠性要求較高的多客戶端資料共享場景中,JuiceFS 是理想的解決方案。

作為開源、易用且功能強大的分散式檔案系統,JuiceFS 能在不同環境中實現資料的高效訪問和共享。其低延遲和高併發能力,讓開發者能夠快速訪問和同步 Conda 虛擬環境,顯著降低環境配置與同步的時間成本。

在開發環境中引入 JuiceFS,並靈活運用其共享和快取功能,可以為 Conda 賦予便捷的資源共享能力。

1. 準備 JuiceFS

JuiceFS 是開源軟體,任何企業和個人都可以在遵循 Apache 2.0 協議的基礎上自由分發使用。

提示:對於效能有更極致要求的使用者,還可以選擇 JuiceFS 的雲服務或私有部署的企業版本,它們由 Juicedata 自研的高效能分散式後設資料引擎驅動,可以承載更大規模的資料。

對於使用開源版的使用者,只需在業務端就近購買物件儲存和資料庫(Redis、Postgres、MySQL 等),或是自行搭建這兩類資源。

JuiceFS 檔案系統的建立非常簡單,有需要可以參考官方文件。這裡採用社群版客戶端,使用本地內網自行搭建的 Redis 和 MinIO 建立一個名為 myjfs 的檔案系統(後設資料引擎為 redis://192.168.3.18/1 )。

完成了檔案系統的建立,接下來需要掛載這個檔案系統。掛載位置可以自行決定,這裡使用了 -d 選項以守護程序的方式掛載到了 /myjfs 目錄,同時開啟了 --writeback 回寫模式,資料會先寫在本地快取盤並非同步寫到物件儲存,從而獲得更快的寫速度。

提示:--writeback 回寫模式對磁碟的可靠性有一定的要求,因為資料會先寫到磁碟快取再存入物件儲存,在寫資料時要防止系統斷電,避免寫不完全。

sudo juicefs mount -d --writeback redis://192.168.3.18/1 /myjfs

JuiceFS 是分散式的檔案系統,在任何能夠訪問到這套 Redis 和 MinIO 的主機上都可以使用 JuiceFS 客戶端同時掛載這個檔案系統。

現在,你可以把 JuiceFS 掛載點當作裝置之間的高效能網盤,用來共享 environment.yml 或 conda-pack 匯出的壓縮包。也可以把 Conda 的預設儲存路徑設定在 JuiceFS 的掛載點(這裡是 /myjfs),讓所有裝置共享使用目錄中的虛擬環境。

2. 修改 Conda 的預設儲存路徑

Conda 的預設儲存路徑可以透過修改配置檔案來變更,Linux 或 macOS 系統位於 ~/.condarc ,Windows 位於 C:\Users\使用者名稱\.condarc,該檔案會在首次執行 conda config 命令時自動建立。

可以手動修改配置檔案中的 envs_dirs 陣列,定義所有可用的虛擬環境儲存路徑。也可以執行命令修改,比如將路徑修改為 /myjfs/conda

conda config --add envs_dirs /myjfs/conda

接下來再建立虛擬環境,就會儲存到 JuiceFS 上面。

同樣的,可以把已經建立的虛擬環境目錄複製到 JuiceFS 上面直接使用。

3. 善用 warmup 加速使用

在其它主機上覆用 Conda 環境時,掛載檔案系統以後,可以使用 JuiceFS 提供的 warmup 命令來預先將相關的目錄預熱到本地,從而加快訪問。如下圖,是將整個 /myjfs/conda 目錄都執行了預熱。

4. 注意事項

對於目錄共享和工具匯出方式的虛擬環境,不同 CPU 架構系統建立的 Conda 虛擬環境之間不能複用。這是因為虛擬環境中安裝的軟體包是針對特定的 CPU 架構進行編譯的。

如下圖,視窗上方的系統是 x86_64 架構的,雖然它可以啟用共享的虛擬環境,但卻無法執行環境中的程式。因為這個虛擬環境是在視窗下方的 aarch64 架構系統上建立的,二者無法共用。

5. 其他問題

在使用 JuiceFS 作為 Conda 虛擬環境儲存路徑時,你會發現讀寫速度沒有本地磁碟那麼快。根本原因在於 JuiceFS 是基於雲的檔案系統,底層的物件儲存和資料庫都是網路資源,讀和寫都會有一定的時延。對效能敏感的讀者可以透過以下方式進行最佳化和調整:

  1. 在內網環境中自建資料庫和物件儲存,儘量讓這些資源與裝置靠近;
  2. 為掛載點主機配備更高速的 SSD,讓快取可以寫在更快的磁碟上;
  3. 加大頻寬,打破網路介面瓶頸。

另外,讀者也可以針對不同的虛擬環境的型別和規模來靈活改變 Conda 虛擬環境共享方法,讓 Conda 和 JuiceFS 都在最適合的狀態下工作。

總結

本文簡要分享了在多機環境下,如何利用 JuiceFS 複用 Conda 虛擬環境的具體方法與注意事項。希望這篇文章中的技巧和經驗能夠為讀者的日常開發和團隊協作提供幫助,並提升工作效率。我們鼓勵感興趣的讀者親自動手嘗試,並在實踐中探索更多的最佳化方式。

如果您在配置和使用過程中遇到任何問題,歡迎前往 JuiceFS 使用者社群進行反饋、提問與交流。您的問題和分享將有助於推動整個社群的進步。

相關文章