在 AWS 建立深度學習環境需要整合多種工具,本文著重於 Airflow 的安裝與設定,包含資料函式庫的選擇與效能調校。從 SQLite 切換到 PostgreSQL,能有效提升資料函式庫在高負載環境下的穩定性與效能。同時,將 Airflow 的 Executor 從 SequentialExecutor 切換到 LocalExecutor,能利用多核心處理器提升任務平行處理能力,縮短整體執行時間。此外,文章也引導讀者設定 PostgreSQL 資料函式庫、建立 Airflow 使用者,以及更新 Airflow 設定檔以確保系統正常運作。最後,文章也簡述了 Docker 和 Docker Compose 的安裝步驟,以及如何設定 EC2 安全群組,讓外部網路能順利連線到 Airflow 和 JupyterLab。

在 AWS 上設定深度學習環境的完整:Apache Airflow 安裝與設定

步驟 3:安裝具備 PostgreSQL 支援的 Apache Airflow

要安裝具備 PostgreSQL 支援的 Apache Airflow,請執行以下指令:

pip install "apache-airflow[postgres]==2.5.0" \
--constraint \
"https://raw.githubusercontent.com/apache/airflow/constraints-2.5.0/constraints-3.7.txt"

內容解密:

  • 此指令安裝指定版本的 Apache Airflow(2.5.0),並包含 PostgreSQL 支援。
  • --constraint 引數確保安裝的依賴套件版本符合指定的 constraints 檔案,確保相容性和穩定性。

步驟 4:初始化 Airflow 資料函式庫

執行以下指令以初始化 Airflow 的中繼資料資料函式庫:

airflow db init

內容解密:

  • 此指令負責初始化 Airflow 的中繼資料資料函式庫,用於儲存 DAG、Task 等相關資訊。

步驟 5:安裝和設定 PostgreSQL

執行以下指令以安裝和設定 PostgreSQL 資料函式庫:

sudo apt-get install postgresql postgresql-contrib
sudo -i -u postgres
psql

內容解密:

  1. sudo apt-get install postgresql postgresql-contrib:安裝 PostgreSQL 資料函式庫及其附加套件。
  2. sudo -i -u postgres:切換至 PostgreSQL 使用者。
  3. psql:進入 PostgreSQL 命令列介面。

步驟 6:在 PostgreSQL shell 中建立 Airflow 資料函式庫和使用者

在 PostgreSQL shell 中執行以下指令:

CREATE DATABASE airflow;
CREATE USER your-username WITH PASSWORD 'your-password';
GRANT ALL PRIVILEGES ON DATABASE airflow TO your-username;
\q
exit

內容解密:

  1. CREATE DATABASE airflow;:建立名為 airflow 的資料函式庫,用於儲存 Airflow 的中繼資料。
  2. CREATE USER your-username WITH PASSWORD 'your-password';:建立一個新的資料函式庫使用者,並設定密碼。請將 your-usernameyour-password 替換為實際的使用者和密碼。
  3. GRANT ALL PRIVILEGES ON DATABASE airflow TO your-username;:授予新建立的使用者在 airflow 資料函式庫上的所有許可權。
  4. \q:離開 PostgreSQL shell。
  5. exit:離開 PostgreSQL 使用者工作階段。

步驟 7:更新 Airflow 設定

進入 Airflow 設定目錄,並更新 airflow.cfg 檔案中的資料函式庫連線字串和 Executor 設定:

cd airflow
sed -i 's#sqlite:////home/ubuntu/airflow/airflow.db#postgresql+psycopg2://your-username:your-password@localhost/airflow#g' airflow.cfg
sed -i 's#SequentialExecutor#LocalExecutor#g' airflow.cfg

內容解密:

  1. cd airflow:切換至 Airflow 設定目錄。
  2. 第一個 sed 指令將 airflow.cfg 中的 SQLite 連線字串替換為 PostgreSQL 連線字串,需替換 your-usernameyour-password 為實際值。
  3. 第二個 sed 指令將 Executor 從 SequentialExecutor 替換為 LocalExecutor,以提升任務執行的平行度。

為何從 SQLite 切換到 PostgreSQL 以及從 SequentialExecutor 切換到 LocalExecutor?

  1. 從 SQLite 切換到 PostgreSQL

    • SQLite 適合開發和測試,但在生產環境中可能無法滿足多使用者、高並發和大資料量的需求。
    • PostgreSQL 是功能強大、開源的關聯式資料函式倉管理系統,具有更好的擴充套件性、可靠性和豐富的功能,能夠更好地處理並發存取和管理大規模資料集。
  2. 從 SequentialExecutor 切換到 LocalExecutor

    • SequentialExecutor 以單一程式順序執行任務,可能成為效能瓶頸。
    • LocalExecutor 能夠在多個工作程式中平行執行任務,提升效能和擴充套件性,更有效地利用運算資源。

步驟 8:建立管理員使用者

執行以下指令以建立 Airflow 管理員使用者:

airflow users create -u your-username -f your-first-name -l your-last-name -r Admin -e your@mail.com

內容解密:

  • 此指令建立一個新的 Airflow 使用者,並賦予管理員角色,需填入實際的使用者資訊。

為什麼需要建立管理員使用者?

建立管理員使用者對於安全管理 Airflow 至關重要。管理員可以執行管理任務,如管理連線、變數、資源池和使用者,以及存取 DAG 執行記錄和日誌。選擇強密碼並限制存取許可權,可以有效防止未授權存取,保護 Airflow 中的敏感資訊。

步驟 9:啟動 Airflow 網頁伺服器和排程器

執行以下指令以啟動 Airflow 網頁伺服器和排程器:

airflow webserver &
airflow scheduler

內容解密:

  1. airflow webserver &:在背景啟動 Airflow 網頁伺服器,提供 UI 介面來管理和監控工作流程。透過在後台執行,即使登出終端機後,網頁 UI 仍可存取。
  2. airflow scheduler:啟動 Airflow 排程器,負責根據定義的排程(例如 cron 表示式)和任務之間的依賴關係觸發任務例項。它持續監控 DAG,以確定需要執行的任務,並根據排程和依賴關係觸發它們。

建議在不同的終端機視窗中執行這兩個指令,以便更好地監控和故障排除每個元件。使用如 tmux 或 screen 等工具,可以在登出後繼續執行這些服務。

設定Apache Airflow於AWS上的深度學習環境

Step 10:存取Airflow UI

要存取Airflow UI,請開啟網頁瀏覽器並導航至您的EC2例項的公用IP位址或網域名稱,後面接著Airflow的連線埠(預設為8080)。例如:http://<您的EC2公用IP>:8080。接著,您將被提示輸入使用者名稱和密碼。輸入您先前建立的憑證,即可登入Airflow UI。

設定連線埠8080以存取Airflow UI

要設定連線埠8080以存取Airflow UI,您需要確保EC2例項的安全群組允許連線埠8080的入站流量,並且Airflow組態為監聽連線埠8080。

EC2安全群組組態

  1. 前往AWS管理主控台並導航至EC2儀錶板。
  2. 選擇正在執行Airflow的例項。
  3. 在例項詳細資訊窗格底部,找到安全群組區段並點選相關聯的安全群組。
  4. 在安全群組設定中,點選「入站規則」標籤。
  5. 點選「編輯入站規則」並新增一條允許來自您的IP位址或任何地方(不建議用於生產環境)在連線埠8080上的流量的規則。
  6. 儲存變更。

組態Airflow監聽連線埠8080

  1. 透過SSH連線到您的EC2例項。
  2. 使用cd命令導航至Airflow組態目錄:cd airflow
  3. 使用文字編輯器(例如Nano)編輯airflow.cfg檔案:nano airflow.cfg
  4. 在組態檔案中找到web_server_port引數並將其設定為8080:web_server_port = 8080
  5. 儲存變更並離開文字編輯器。
  6. 儲存變更後,需要重新啟動Airflow網頁伺服器以使變更生效。您可以透過停止和重新啟動Airflow網頁伺服器程式來實作這一點。
    • 找到Airflow網頁伺服器的程式ID(PID):ps aux | grep 'airflow webserver'
    • 使用PID終止Airflow網頁伺服器程式:kill <PID>
    • 再次啟動Airflow網頁伺服器:airflow webserver &

Docker基礎設定

在Docker中執行Apache Airflow相較於傳統的獨立安裝提供了顯著的優勢,提供了一種流線型、一致的環境,簡化了設定、減少了組態錯誤,並增強了可移植性。Docker將Airflow及其依賴項封裝在容器內,確保了在不同系統上的可靠工作流程執行,無論是在開發、測試還是生產環境中。

Step 1:建立指令碼檔案

  1. 一旦透過SSH連線到您的EC2例項,首先建立一個新的shell指令碼檔案:nano install-docker.sh
  2. 將Docker提供的整個指令碼內容複製並貼上到此檔案中。此指令碼可在https://get.docker.com/ 上找到,並自動執行Docker安裝程式。

Step 2:使指令碼可執行

  1. 貼上指令碼後,按Ctrl + X,然後按Y,並輸入Enter以儲存並關閉檔案。
  2. 透過執行以下命令將指令碼設定為可執行:chmod +x install-docker.sh

Step 3:以root許可權執行指令碼

  1. 以管理員許可權執行指令碼以安裝Docker:sudo ./install-docker.sh
  2. 指令碼將檢測您的Linux發行版和版本,然後相應地繼續進行Docker安裝。

Step 4:驗證Docker安裝

  1. 指令碼完成後,透過執行以下命令驗證Docker是否正確安裝:docker --version
  2. 您應該會看到在您的例項上安裝的Docker版本,確認安裝成功。

Step 5:執行測試Docker容器

  1. 為確保Docker正常工作,請執行一個測試Docker容器:sudo docker run hello-world
  2. 此命令將下載一個測試映像並執行它,如果成功,將顯示確認訊息。

#### 內容解密:

此步驟展示如何使用Docker官方提供的便利指令碼在EC2例項上安裝Docker。首先,我們建立一個shell指令碼檔案,並將Docker安裝指令碼的內容複製到其中。然後,我們使該指令碼可執行並以管理員許可權執行它。安裝完成後,我們驗證Docker是否正確安裝,並透過執行一個測試容器來確保其正常運作。

後續步驟

Step 6:安裝Docker Compose

使用以下命令下載並安裝Docker Compose:

sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s | tr '[:upper:]' '[:lower:]')-$(uname -m)" -o /usr/bin/docker-compose
sudo chmod 755 /usr/bin/docker-compose

第一個命令從官方GitHub儲存函式庫下載最新的Docker Compose二進位制檔案,為您的系統選擇正確的版本並將其儲存到/usr/bin/docker-compose。第二個命令透過設定適當的許可權使Docker Compose二進位制檔案可執行。

#### 內容解密:

此步驟展示如何安裝Docker Compose。首先,我們使用curl命令從GitHub下載最新的Docker Compose二進位制檔案,並將其儲存到/usr/bin/docker-compose。然後,我們透過chmod命令使該檔案可執行。這樣,我們就成功安裝了Docker Compose。

Step 7:下載Airflow Docker Compose組態

Apache Airflow提供了一個官方的Docker Compose設定,使得執行Airflow變得容易。下載docker-compose.yaml檔案,該檔案包含在Docker容器中執行Airflow及其相關服務(如PostgreSQL和Redis)的組態:

curl -LfO 'https://airflow.apache.org/docs/apache-airflow/2.7.2/docker-compose.yaml'

#### 內容解密:

此步驟展示如何下載Apache Airflow官方提供的docker-compose.yaml檔案,該檔案定義了執行Airflow及其相關服務所需的組態。透過下載此檔案,我們可以輕鬆地在Docker容器中啟動Airflow及其依賴服務。

Step 8:準備環境

  1. 建立Airflow將用於DAGs、logs和plugins的目錄:mkdir -p ./dags ./logs ./plugins
  2. 建立一個.env檔案以設定必要的環境變數,包括您的使用者ID和群組ID,以避免許可權問題:echo -e "AIRFLOW_UID=$(id -u)\nAIRFLOW_GID=0" > .env

#### 內容解密:

此步驟展示如何準備Airflow在Docker中執行的環境。首先,我們建立必要的目錄(dags、logs和plugins),以便Airflow能夠正確運作。然後,我們建立一個.env檔案,並在其中設定必要的環境變數,包括AIRFLOW_UID和AIRFLOW_GID,以確保Airflow在容器中具有正確的許可權。

在AWS上設定深度學習環境的關鍵步驟

在AWS上建立深度學習環境涉及多個關鍵步驟,包括設定Airflow、JupyterLab以及Databricks等工具。以下將詳細介紹這些步驟及其實作細節。

設定Airflow

Airflow是一個強大的工作流程管理工具,用於排程和管理工作流程。以下是在AWS EC2例項上設定Airflow的步驟:

  1. 初始化Airflow資料函式庫:使用docker compose up airflow-init命令初始化Airflow資料函式庫。
  2. 啟動Airflow服務:使用docker compose up -d命令在後台啟動Airflow服務。
  3. 檢查Airflow容器狀態:使用docker compose ps命令檢查Airflow容器的狀態。
  4. 存取Airflow網頁介面:在瀏覽器中輸入http://<your-ec2-public-ip>:8080存取Airflow網頁介面。

設定安全群組以允許存取Airflow

為了能夠存取Airflow網頁介面,需要在EC2例項的安全群組中開放8080埠。具體步驟如下:

  • 在AWS管理控制檯中選擇相應的EC2例項。
  • 編輯安全群組的入站規則,新增一條允許TCP流量透過8080埠的規則。

安裝JupyterLab

JupyterLab是一個根據網頁的互動式開發環境,支援多種程式語言。以下是安裝和設定JupyterLab的步驟:

  1. 安裝JupyterLab:在EC2例項上執行pip install jupyterlab命令安裝JupyterLab。
  2. 生成Jupyter Notebook設定檔:執行jupyter notebook --generate-config命令生成設定檔。
  3. 設定JupyterLab密碼:執行jupyter notebook password命令設定密碼。
  4. 啟動JupyterLab:執行jupyter lab --ip=0.0.0.0 --port=8888 --no-browser命令啟動JupyterLab。

設定安全群組以允許存取JupyterLab

與Airflow類別似,需要在EC2例項的安全群組中開放8888埠以允許存取JupyterLab。

設定Databricks帳戶和工作區

Databricks是一個統一的分析平台,支援大資料處理和深度學習。以下是建立Databricks帳戶和工作區的步驟:

  1. 註冊Databricks帳戶:存取Databricks官網註冊帳戶。
  2. 確認電子郵件地址:點選Databricks傳送的驗證郵件中的連結確認電子郵件地址。
  3. 登入Databricks:使用註冊的帳戶登入Databricks平台。
  4. 建立工作區:按照提示建立Databricks工作區。

從Databricks存取S3儲存桶

可以使用以下程式碼從Databricks存取S3儲存桶:

ACCESS_KEY = "your-access-key"
SECRET_KEY = "your-secret-key"
AWS_BUCKET_NAME = "your-bucket-name"
MOUNT_NAME = "/mnt/datalake-central"

dbutils.fs.mount(
    source=f"s3a://{ACCESS_KEY}:{SECRET_KEY}@{AWS_BUCKET_NAME}/",
    mount_point=MOUNT_NAME,
    extra_configs={"fs.s3a.access.key": ACCESS_KEY, "fs.s3a.secret.key": SECRET_KEY}
)

程式碼解析

此程式碼用於將S3儲存桶掛載到Databricks檔案系統。

  • ACCESS_KEYSECRET_KEY變數儲存AWS的存取金鑰和秘密金鑰,用於身份驗證。
  • AWS_BUCKET_NAME變數儲存要掛載的S3儲存桶名稱。
  • MOUNT_NAME變數指定掛載點,通常以/mnt/開頭,後面跟著自訂的掛載名稱。
  • dbutils.fs.mount()函式用於掛載S3儲存桶到指定的掛載點,並傳遞必要的組態引數,如存取金鑰和秘密金鑰。