來 Azure 學習 OpenAI 二 - 環境構建
Published: 2023-04-03 00:30:00

大家好，我是微軟學生大使 Jambo 。如今，越來越多的人擁有多台開發設備，例如在家和辦公室都有電腦。但是跨設備開發是件麻煩的事情，因為你不僅需要同步文件，還需要在不同的設備上安裝相同的開發環境。而對於使用輕型設備，比如 Chromebook 和 iPad，複雜的開發環境也很難被支持。在這種情況下，雲端開發將會是一個很好的選擇。

把工作環境放在雲端，無論你使用哪個設備，只要能上網，你就可以獲得完全統一的開發環境，而且無需擔心硬件算力的問題。例如，你可以在iPad上打開雲端開發環境，然後在筆記本電腦上繼續工作，這種靈活性是傳統開發模式無法比擬的。

我在這篇文章中將會介紹兩種在雲上開發的方式，一種是使用 GitHub Codespaces，另一種是使用 Azure ML。

# Codespaces 是什麼

GitHub Codespaces 是一種託管在雲端的開發環境，它可以讓你利用雲服務器資源進行開發和編譯。 Codespaces 運行在 Azure 虛擬機中的 Docker 容器中，默認情況下使用 Ubuntu Linux 映像。你可以根據自己的需求對 Codespaces 進行配置，同時其他人也可以使用你為項目配置的環境創建自己的 Codespaces 進行標準化的工作。

![26](https://raw.githubusercontent.com/JamboChen/Jambo-blog/master/img/config_env/26.png)

你可以從瀏覽器、Visual Studio Code、JetBrains Gateway 應用程序或使用 GitHub CLI 連接到 Codespaces。就像在本地開發一樣，Codespaces 可以保存你所做的代碼修改和文件更改，即使停止了 Codespaces，也可以在以後繼續使用。除非你將 Codespaces 刪除，否則它將一直佔用雲上的資源。

# 如何創建 Codespaces

你可以從項目倉庫或現有模板創建 Codespaces。如果你從項目倉庫創建 Codespaces，它會自動將倉庫克隆到開發環境中。如果倉庫中包含 `.devcontainer` 文件夾，則說明項目作者為該項目創建了標準的 Codespaces 配置。在創建 Codespaces 時，將自動使用此配置創建容器。

## 為儲存庫創建

進入儲存庫，點擊左上角的 “Code” ，在 “Codespaces” 標籤中點擊 “Create Codespaces on {fork-name}”

![27](https://raw.githubusercontent.com/JamboChen/Jambo-blog/master/img/config_env/27.png)

如果你要做關於服務器地區、核心數量的設置，也可以在 “New with options...” 中進行設定。

![28](https://raw.githubusercontent.com/JamboChen/Jambo-blog/master/img/config_env/28.png)
![29](https://raw.githubusercontent.com/JamboChen/Jambo-blog/master/img/config_env/29.png)

## 從模板創建

我們可以從 GitHub 頁首的 `Codespaces` 進入此頁面，其中包含了官方提供的一些模板，你也可以在其中管理你的 Codespaces。

![30](https://raw.githubusercontent.com/JamboChen/Jambo-blog/master/img/config_env/30.png)

在“See all” 中可以查看完整的模板列表，點擊模板的黑體名字也可以查看模板 儲存庫。

![31](https://raw.githubusercontent.com/JamboChen/Jambo-blog/master/img/config_env/31.png)

點擊“Use this template”就可以根據模板創建 Codespaces 。如果你在模板儲存庫也可以在 “Use this template” 中點擊 “Open in a Codespaces” 創建。

![32](https://raw.githubusercontent.com/JamboChen/Jambo-blog/master/img/config_env/32.png)

# 配置 Codespaces

Codespaces 是運行在 Docker 容器中的，因此你可以為儲存庫配置專門的開發環境。 Codespaces 的配置文件是 `devcontainer.json` ，通常位於 `.devcontainer` 目錄中。你可以創建多個配置文件，但是這種情況下它們需要儲存在各自的子目錄中，例如：

- `.devcontainer/database-dev/devcontainer.json`
- `.devcontainer/gui-dev/devcontainer.json`
當你進入 Codespaces 時，呼出 VS code 的命令面板（`ctrl`+`shift`+`P`），鍵入 “add dev” ，並點選。

![33](https://raw.githubusercontent.com/JamboChen/Jambo-blog/master/img/config_env/33.png)

選擇 “Create...” 以創建新的配置，如果你要編輯現有的配置文件就選擇 “Modify...”。

![34](https://raw.githubusercontent.com/JamboChen/Jambo-blog/master/img/config_env/34.png)

選擇 “Show All Definitions...”。

![35](https://raw.githubusercontent.com/JamboChen/Jambo-blog/master/img/config_env/35.png)

接下來根據自己的需要選擇環境，這裡我選擇 “Python 3”，然後選擇你想要的版本。

![36](https://raw.githubusercontent.com/JamboChen/Jambo-blog/master/img/config_env/36.png)

然後選擇你想要添加的功能，比如環境管理工具 “Conda”。

![1](https://raw.githubusercontent.com/JamboChen/Jambo-blog/master/img/config_env/1.png)
你還可以將 VS code 拓展添加進配置中。

![4](https://raw.githubusercontent.com/JamboChen/Jambo-blog/master/img/config_env/4.png)

為了讓 conda 可以順利初始化，我們需要修改 `devcontainer.json` 中的 `postCreateCommand` 參數，這個參數是第一次創建 Codespaces 時會執行的命令。關於其他參數可以參考 [metadata reference](https://containers.dev/implementors/json_reference/)。

```json
    "postCreateCommand": "conda init && source ~/.bashrc"
```

![37](https://raw.githubusercontent.com/JamboChen/Jambo-blog/master/img/config_env/37.png)

我們呼出命令面板，輸入 “rebuild” 讓他重新構建。

![38](https://raw.githubusercontent.com/JamboChen/Jambo-blog/master/img/config_env/38.png)

等他構建完成後，可以看到他已經自動安裝了 Python 相關的拓展。

![2](https://raw.githubusercontent.com/JamboChen/Jambo-blog/master/img/config_env/2.png)

並且 conda 也可以正常使用了，我們可以創建一個新的 python 環境。

```bash
$ conda create -n openai python=3.11
...
Proceed ([y]/n)? y
...
$ conda activate openai
```

這時我們就可以在 “openai” 這個環境中進行開發。我們首先安裝一些需要的庫。

```bash
pip install openai
```

我們開一個 Jupyter 來做個示例。首先需要選擇正確的內核，點擊左上角的 “Select Kernel”，“Select Another Kernel”，“Python Env...”，選擇 “openai”，如果你先前創建的 conda 環境不在此列表中，可以點擊左上角的刷新鍵來刷新。

![5](https://raw.githubusercontent.com/JamboChen/Jambo-blog/master/img/config_env/5.png)
![6](https://raw.githubusercontent.com/JamboChen/Jambo-blog/master/img/config_env/6.png)
![7](https://raw.githubusercontent.com/JamboChen/Jambo-blog/master/img/config_env/7.png)

我在 Azure 上開了一個 OpenAI 服務，將 Key 等相關數據儲存在 `develop.json` 中，然後通過 `openai` 庫調用 API。

![3](https://raw.githubusercontent.com/JamboChen/Jambo-blog/master/img/config_env/3.png)

如果你更習慣 Jupyter 的界面，而不是 VS code，Codespaces 也支持端口轉發。

```bash
pip install jupyterlab
jupyter lab
```

![8](https://raw.githubusercontent.com/JamboChen/Jambo-blog/master/img/config_env/8.png)
![9](https://raw.githubusercontent.com/JamboChen/Jambo-blog/master/img/config_env/9.png)
你可以在 Terminal 的 PORTS 頁面中查看轉發的端口。只要 CodeSpaces 是開啟狀態，你就可以通過對應的網址訪問端口。
![10](https://raw.githubusercontent.com/JamboChen/Jambo-blog/master/img/config_env/10.png)
如果你想讓其他人也能夠訪問端口，你還可以將端口設為公開，此時即使是沒有登錄 GitHub 的情況下也可以進入網頁。
![11](https://raw.githubusercontent.com/JamboChen/Jambo-blog/master/img/config_env/11.png)

# 管理 Codespaces

在使用 Codespaces 時，會產生計算費用和儲存費用。為了避免不必要的損失，你需要記得停止或關閉 Codespaces。當停止 Codespaces 時將不會產生計算費用，但是仍會產生儲存費用。

![39](https://raw.githubusercontent.com/JamboChen/Jambo-blog/master/img/config_env/39.png)

如果你的 Codespaces 是從模板創建的，你可以在管理頁面中將其內容髮佈到儲存庫中。請注意，如果你要將 Codespaces 發佈到儲存庫中，Codespaces 需要處於停止狀態。

![40](https://raw.githubusercontent.com/JamboChen/Jambo-blog/master/img/config_env/40.png)

選擇“公開”或者“私人”後點擊創建即可。

![41](https://raw.githubusercontent.com/JamboChen/Jambo-blog/master/img/config_env/41.png)

除了發布和刪除 Codespaces，管理頁面還可以讓你查看和修改 Codespaces 的配置信息，如 Docker 鏡像、環境變量等。此外，你還可以查看與 Codespaces 相關的費用信息，以及訪問控制等設置。即使停止 Codespaces，他也會將你的更改保存下來，除非你將其刪除，才會徹底釋放在雲上的資源。

項目地址：[https://github.com/JamboChen/codespases-Jambo](https://github.com/JamboChen/codespases-Jambo)

# Azure ML 是什麼

如果你需要進行深度學習或 CUDA 方面的開發，那麼一定少不了要安裝各種驅動和庫，這是個十分繁瑣的工作。而 Azure 機器學習可以幫助你快速搭建一個 GPU 加速的環境，可以讓你直接進行相關的開發。

# 創建 Azure ML

對於學生黨，可以參考我上一篇教程 [註冊 Azure 和申請 OpenAI](http://t.csdn.cn/Wg89x) 來創建 Azure 賬號，可以獲得 Azure 100 美金的免費額度。

進入 Azure 首頁，上方搜索框中輸入 “機器學習”，點擊 “Azure 機器學習”。

![12](https://raw.githubusercontent.com/JamboChen/Jambo-blog/master/img/config_env/12.png)

點擊 “創建”。

![13](https://raw.githubusercontent.com/JamboChen/Jambo-blog/master/img/config_env/13.png)

在 “創建 Azure 機器學習工作區” 頁面中，你可以選擇你的訂閱，以及工作區的名稱、位置、資源組等信息。要注意的是，如果你需要 GPU 資源， 那麼地區一定要選擇 “West US 2”

![14](https://raw.githubusercontent.com/JamboChen/Jambo-blog/master/img/config_env/14.png)

確認無誤後點擊 “審閱和創建”，再次確認後點擊 “創建”。等待創建完成後，你就可以進入 Azure 機器學習的管理頁面了。

![15](https://raw.githubusercontent.com/JamboChen/Jambo-blog/master/img/config_env/15.png)

在左側菜單的 “計算” 頁面中，點擊 “新建”。

![16](https://raw.githubusercontent.com/JamboChen/Jambo-blog/master/img/config_env/16.png)

根據你的需要選擇虛擬機類型，這裡我選擇 “GPU”，他默認使用 Tesla K80 GPU，如果你需要更高性能的 GPU，可以選擇 “從所有選項中選擇”。但你可能需要申請配額。點擊創建後稍等片刻就創建成功了

![17](https://raw.githubusercontent.com/JamboChen/Jambo-blog/master/img/config_env/17.png)

我們可以轉到 “Notebooks” 頁面，點擊 Terminal，進入終端。輸入 `nvcc --version` 來查看 cuda 的信息。

![18](https://raw.githubusercontent.com/JamboChen/Jambo-blog/master/img/config_env/18.png)

接下來我們新建一個 `helloworld.cu` 文件。

```bash
nano helloworld.cu
```

輸入以下代碼，`Ctrl` + `X` 退出，`Y` 保存，`Enter` 確認。

```cuda
#include <stdio.h>
__global__ void helloFromGPU()
{
    printf("Hello World! from thread [%d, %d]\
            block [%d, %d]\n",
           threadIdx.x, threadIdx.y,
           blockIdx.x, blockIdx.y);
}

int main()
{
    printf("Hello World! from CPU\n");

    // declare a 2D grid and 2D block
    dim3 block(1, 2);
    dim3 grid(1, 2);

    // launch the kernel on the device
    helloFromGPU<<<grid, block>>>();

    // wait for all previous operations to complete
    cudaDeviceSynchronize();

    return 0;
}
```

運行編譯命令。要注意的是由於 K80 架構較舊，所以我們需要指定架構，否則將無法正確執行 GPU 相關的代碼。

```bash
nvcc -arch=sm_37 helloword.cu -o helloword
./helloword
```

![19](https://raw.githubusercontent.com/JamboChen/Jambo-blog/master/img/config_env/19.png)

架構相關的信息可以參考下圖：

![20](https://raw.githubusercontent.com/JamboChen/Jambo-blog/master/img/config_env/20.png)

在這個頁面上，還可以創建 ipynb 文文件。

![21](https://raw.githubusercontent.com/JamboChen/Jambo-blog/master/img/config_env/21.png)
![22](https://raw.githubusercontent.com/JamboChen/Jambo-blog/master/img/config_env/22.png)
![23](https://raw.githubusercontent.com/JamboChen/Jambo-blog/master/img/config_env/23.png)

當然如果你更習慣 Jupyter 的界面，也可以從 “計算” 頁面中進入。

![24](https://raw.githubusercontent.com/JamboChen/Jambo-blog/master/img/config_env/24.png)

要注意的是 Azure ML 是計時收費的，所以如果你有段時間不使用，可以將其停止，以免產生不必要的費用。

![25](https://raw.githubusercontent.com/JamboChen/Jambo-blog/master/img/config_env/25.png)

最後這裡整理一份給大學生們的免費資源：

Azure 免費資源：[https://aka.ms/studentgetazure](https://aka.ms/studentgetazure)
GitHub 教育包：[https://aka.ms/GitHubStudentDevPackSS23](https://aka.ms/GitHubStudentDevPackSS23)

---

系列往期文章：
1. [同學們，快來Azure 一起學習 OpenAI（一）](https://dev.to/jambochen/xue-sheng-dang-kuai-lai-azure-qi-xue-xi-openai--1pe6)