貢獻 JAX#

每個人都可以為 JAX 做出貢獻,我們重視每個人所做的貢獻。有幾種貢獻方式,包括:

JAX 專案遵循Google 開源社群指南

貢獻方式#

我們歡迎 Pull Request,特別是標記為歡迎貢獻適合新手的問題。

對於其他提案,我們要求您先開啟 GitHub IssueDiscussion 以尋求對您計劃貢獻的回饋。

使用 Pull Request 貢獻程式碼#

我們所有的開發都使用 git,因此假設您具備基本知識。

請按照以下步驟貢獻程式碼

  1. 簽署 Google 貢獻者授權協議 (CLA)。 詳情請參閱下面的 Pull Request 檢查清單。

  2. 通過點擊儲存庫頁面上的 Fork 按鈕來 Fork JAX 儲存庫。 這會在您自己的帳戶中建立 JAX 儲存庫的副本。

  3. 在本機安裝 Python >= 3.10 以執行測試。

  4. pip 從原始碼安裝您的 Fork。 這讓您可以修改程式碼並立即進行測試

    git clone https://github.com/YOUR_USERNAME/jax
    cd jax
    pip install -r build/test-requirements.txt  # Installs all testing requirements.
    pip install -e ".[cpu]"  # Installs JAX from the current directory in editable mode.
    
  5. 將 JAX 儲存庫新增為上游遠端,以便您可以使用它來同步您的變更。

    git remote add upstream https://www.github.com/jax-ml/jax
    
  6. 建立一個分支,您將從該分支進行開發

    git checkout -b name-of-change
    

    並使用您最喜歡的編輯器 (我們推薦 Visual Studio Code) 實作您的變更。

  7. 通過從儲存庫的頂層執行以下命令,確保您的程式碼通過 JAX 的程式碼風格檢查和型別檢查

    pip install pre-commit
    pre-commit run --all
    

    有關更多詳細資訊,請參閱程式碼風格檢查和型別檢查

  8. 通過從儲存庫的頂層執行以下命令,確保測試通過

    pytest -n auto tests/
    

    JAX 的測試套件非常龐大,因此如果您知道涵蓋您變更的特定測試檔案,則可以將測試限制於該檔案;例如

    pytest -n auto tests/lax_scipy_test.py
    

    您可以通過使用 pytest -k 旗標來匹配特定的測試名稱,從而進一步縮小測試範圍

    pytest -n auto tests/lax_scipy_test.py -k testLogSumExp
    

    JAX 還提供更細緻的控制,以控制要運行的特定測試;有關更多資訊,請參閱運行測試

  9. 一旦您對您的變更感到滿意,請按如下方式建立提交 ( 如何編寫提交訊息)

    git add file1.py file2.py ...
    git commit -m "Your commit message"
    

    然後將您的程式碼與主儲存庫同步

    git fetch upstream
    git rebase upstream/main
    

    最後,在您的開發分支上推送您的提交,並在您的 Fork 中建立一個遠端分支,您可以使用該分支來建立 Pull Request

    git push --set-upstream origin name-of-change
    

    請確保您的貢獻是單一提交 (請參閱單一變更提交和 Pull Request)

  10. 從 JAX 儲存庫建立 Pull Request 並發送以供審查。 檢查JAX Pull Request 檢查清單,以了解準備 PR 時的注意事項,如果您需要更多有關使用 Pull Request 的資訊,請查閱 GitHub 幫助

JAX Pull Request 檢查清單#

在您準備 JAX Pull Request 時,請記住以下幾點

Google 貢獻者授權協議#

對此專案的貢獻必須附帶 Google 貢獻者授權協議 (CLA)。 您 (或您的雇主) 保留對您的貢獻的著作權;這僅僅是給予我們許可,以使用和重新發布您的貢獻作為專案的一部分。 請前往 https://cla.developers.google.com/ 查看您目前已歸檔的協議或簽署新的協議。

您通常只需要提交一次 CLA,因此如果您已經提交過 CLA (即使是針對不同的專案),您可能不需要再次提交。 如果您不確定是否已簽署 CLA,您可以開啟您的 PR,我們友好的 CI 機器人會為您檢查。

單一變更提交和 Pull Request#

git 提交應該是一個自包含的、帶有描述性訊息的單一變更。 這有助於審查,並有助於在以後發現問題時識別或還原變更。

Pull Request 通常包含單一 git 提交。 (在某些情況下,例如對於大型重構或內部重寫,它們可能包含多個。) 在準備用於審查的 Pull Request 時,您可能需要將多個提交合併在一起。 如果可能,我們要求您在發送 PR 進行審查之前執行此操作。 git rebase -i 命令可能對此有所幫助。

程式碼風格檢查和型別檢查#

JAX 使用 mypyruff 來靜態測試程式碼品質;在本地運行這些檢查的最簡單方法是通過 pre-commit 框架

pip install pre-commit
pre-commit run --all-files

如果您的 Pull Request 涉及文件筆記本,這也將對這些筆記本運行一些檢查 (有關更多詳細資訊,請參閱更新筆記本)。

完整的 GitHub 測試套件#

您的 PR 將自動通過 GitHub CI 上的完整測試套件運行,該套件涵蓋一系列 Python 版本、依賴版本和配置選項。 這些測試出現您在本地沒有捕獲到的失敗是正常的;要修復這些問題,您可以將新的提交推送到您的分支。

受限制的測試套件#

一旦您的 PR 經過審查,JAX 維護者會將其標記為 pull ready。 這將觸發更大規模的測試集,包括在標準 GitHub CI 中不可用的 GPU 和 TPU 後端上的測試。 這些測試的詳細結果不公開可見,但分配給您的 PR 的 JAX 維護者將與您溝通這些測試可能發現的任何失敗;例如,數值測試在 TPU 上可能需要與 CPU 上不同的容差,這並不罕見。