AWSエンジニアが学習するAlibaba Cloud【Function Compute編 (9)】

普段AWSを主に利用しているエンジニアがAlibabaCloudを学習するために調べた情報や手順を紹介します。

今回は「Serverless DevsとFunction ComputeのGPUインスタンスを使った画像合成」に挑戦してみたいと思います。

## ■ Disclaimer

本記事は掲載時点の情報であり、最新の情報とは異なる場合があります。
本記事は完全性、正確性、有用性、安全性などを保証するものではありません。
本記事をご利用の場合は自己責任にてお願いします。

## ■ Prerequisites

- Alibaba Cloudアカウントを作成済みであることを前提とします。
  - [Alibaba Cloud アカウントを作成](https://www.alibabacloud.com/help/ja/maxcompute/latest/create-an-alibaba-cloud-account)
- [AWSエンジニアが学習するAlibaba Cloud【Function Compute編 (2)】](https://qiita.com/junk87/items/aa19c264f835c20f40dd)を実施済みの環境であることを前提とします。
  - Function Computeの実行確認済
  - ServerlessDevs用のRAMユーザーを作成済
    - <font color="red">**今回の検証では手軽にAI 技術を体験頂くことを優先し、システムポリシーの権限追加にて「AdministratorAccess」を選択していますが、動作確認後は速やかに権限を削除してください**</font>
    - <font color="red">**本番環境など実環境においてはでは必要最小限の権限のみを選択してください**</font>

## ■ Overview

手順については[Best practices for AI](https://www.alibabacloud.com/help/en/function-compute/latest/best-practices-of-artificial-intelligence#p-vgv-bv4-r8z)の記事に掲載されたチュートリアルに基づいています。
Function ComputeのGPUインスタンスを活用したAIアプリケーション開発の効率性やコスト効率の向上についての説明は省きますが詳細について深く理解したい方は、該当記事をご覧ください。

本記事ではチュートリアル実施前の以下の事前準備の手順を記載します。

- OSSのバケット作成およびオブジェクトのアップロード
- Container Registry Personal Edition インスタンスの作成
- ECSインスタンスの作成
- Dockerのインストール
- ServerlessDevsのインストールおよび初期設定

## ■ Let’s Get Started

#### 1. AlibabaCloudにサインイン

自分のアカウント（メールアドレス）とパスワードを入力の上、【サインイン】をクリックします。

![FunctionCompute_10001.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/646bbf8a-6b64-02d8-ead7-3d55f6f5e859.png)

#### 2. OSSのバケット作成およびオブジェクトのアップロード

##### 2.1. OSSコンソール画面へ移動

画面上部の検索窓へ【OSS】と入力して表示される検索結果よりObject Storage Serviceを選択してOSSコンソール画面へ移動します。

![FunctionCompute_90002.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/f7aa157f-710c-5b90-4d75-9f84cfa84d67.png)

##### 2.2. バケット作成画面へ移動

OSSコンソール画面より「バケットリスト」を選択の上、【バケットの作成】をクリックします。

![FunctionCompute_90003.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/74fea1e3-2b69-f3b2-f54f-270c83ba368b.png)

##### 2.3. バケットの作成

バケット作成画面では以下の必須項目を入力後、【OK】をクリックしてサービスを作成します。
必須項目以外は初期値のままで構いません。

- バケット名：fc-gpu-prj-[AlibabaアカウントID]
    - バケットの名前は、Alibaba Cloud アカウントの OSS 内で一意である必要があります。詳細は[Create buckets](https://www.alibabacloud.com/help/en/object-storage-service/latest/oss-console-create-buckets#task-u3p-3n4-tdb)をご確認ください
    - 本手順ではAlibabaアカウントIDを名前の後ろにつけることでバケット名が一意となるようにしています
    - **チュートリアルの際にバケット名が必要となるので控えておいてください**
- リージョン：Japan(Tokyo)
- ストレージクラス：標準ストレージ
- 冗長性：LRS
    - 今回はローカル冗長ストレージ(LRS)を選択します
- ACL：公開読み取り／書き込み
    - 「[公開読み書き]を選択してもよろしいですか」の画面が表示されますが今回のチュートリアルでは「公開読み取り／書き込み」の権限が必要となりますので【変更する】を選択します
    - <font color="red">**チュートリアル終了後は速やかに「非公開」へ変更してください**</font>
    - <font color="red">**本番環境など実環境においては、必要最小限の権限付与を行うよう強く推奨します**</font>

![FunctionCompute_90004.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/78fe0e2a-c929-240f-7097-ec6f007324e5.png)

作成完了後、【バケットに移動】をクリックします。

![FunctionCompute_90005.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/91d1f502-715a-d069-c262-ef5e9f6dbc73.png)

##### 2.4. オブジェクトのダウンロード

[Best practices for AI](https://www.alibabacloud.com/help/en/function-compute/latest/best-practices-of-artificial-intelligence#p-vgv-bv4-r8z)のTutorial for neural style transferにある「Content image」の画像と「Style image」の画像を右クリックの上、「名前をつけて画像を保存」を選択してローカルに画像を保存します。

![FunctionCompute_90006.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/e4b59972-ad23-bfa6-4619-3481944ccbca.png)

「名前をつけて画像を保存」を選択の際、ファイル名は下記名前で保存してください。

- Content imageの画像ファイル名：c1.png
- Style imageの画像ファイル名：c2.png

##### 2.5. オブジェクトのアップロード

OSSコンソールの対象バケット画面より【アップロード】をクリックします

![FunctionCompute_90007.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/1f164ca8-a318-6e43-d5ee-785cba03e7a9.png)

「アップロードするファイル」へダウンロード済みのc1.pngおよびc2.pngをドラック＆ドロップの上、【アップロード】を選択します。

![FunctionCompute_90008.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/7345c525-939d-0b3d-b041-d85b937a9417.png)

タスクリストにて正常にアップロードが完了していることを確認します。

![FunctionCompute_90009.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/7a2ba1b1-5737-ea15-6e64-498b25df2013.png)

画面左の「オブジェクト」を選択してc1.pngおよびc2.pngが表示されていることを確認します。

![FunctionCompute_90010.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/c9972486-eb02-ad47-f2ca-d229ab4a556e.png)

#### 3. Container Registry Personal Edition インスタンスの作成

##### 3.1. Container Registryコンソール画面へ移動

画面上部の検索窓へ【Container Registry】と入力して表示される検索結果よりContainer Registryを選択してContainer Registryコンソール画面へ移動します。

![FunctionCompute_90011.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/f06e6b24-2bec-e8be-67f6-7dbfabc262b6.png)

##### 3.2. Personal Edition のインスタンス画面へ移動

Container Registryコンソール画面にて「Personal Edition」カードを選択します

![FunctionCompute_90012.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/1175a1de-6e36-f91f-b697-db65cb6bb13f.png)

ヒント画面にて【Container Registry Personal Editionインスタンスの作成】をクリックします。
**※【インスタンスの作成】ではありません**

![FunctionCompute_90012-001.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/1b5c9612-8c0d-4f03-261c-735e5c2ff98a.png)

再度ヒント画面が表示されますので□にチェック後、【OK】をクリックします。

![FunctionCompute_90012-002.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/96378f21-a88b-d502-e298-604bd95b606d.png)

##### 3.3. アクセス資格情報の設定

Personal Editionのインスタンス画面にて表示されるアクセス資格情報の【Dockerログインパスワードのリセット】をクリックします。

![FunctionCompute_90012-003.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/f9f99183-ce8b-295e-9447-0667528571e1.png)

Dockerログインパスワードのリセットでは以下の項目を入力後、【OK】をクリックしてパスワードをリセットします。**Dockerパスワードは忘れないよう必ず控えておいてください**

- パスワード：8～32 文字で、 英文字、数字、記号から 2 種類以上の文字で作成
- パスワードの確認：パスワードを再度入力

![FunctionCompute_90012-004.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/c71a8137-3ad3-62ff-48bd-1b7db6fc4743.png)

Dockerパスワードリセット後、リージョンを「Japan(Tokyo)」へ変更します。

![FunctionCompute_90012-005.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/99ec9b61-6897-4f9a-e2df-6855fe030d9f.png)

##### 3.4. 名前空間を作成

画面左の「名前空間」を選択後、【名前空間の作成】をクリックします。

![FunctionCompute_90013.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/bb610a21-bc89-0a92-dcb2-cb6899fbf661.png)

名前空間作成画面では以下の項目を入力後、【OK】をクリックして名前空間を作成します。

- 名前空間：fc-gpu-prj-[AlibabaアカウントID]
    - 挙動を確認した限りとはなりますが、Personal Editionでは名前空間についてもOSSバケット同様、一意とならなければいけないようです
    - 本手順ではOSSバケット同様、AlibabaアカウントIDを名前の後ろにつけることで名前空間が一意となるようにしています

![FunctionCompute_90016-02.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/455fee61-8f24-2eb1-dcc4-daa9a6e5e19e.png)


##### 3.5. リポジトリを作成

画面左の「リポジトリ」を選択後、【リポジトリの作成】をクリックします。


![FunctionCompute_90015.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/f2ab3473-62f6-d713-56c9-5b9e4c64b00b.png)



リポジトリ作成のリポジトリ情報画面では以下の必須項目を入力後、【次】をクリックします。
必須項目以外は初期値のままとします。

- 名前空間：fc-gpu-prj-[AlibabaアカウントID]
- リポジトリ名：fc-gpu-prj-neural_style_transfer
- サマリー：Tutorial for neural style transfer

![FunctionCompute_90016-02.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/e3ae9f8c-9345-9cea-a480-773fdc5ce818.png)



リポジトリ作成のコードソース画面では「ローカルレポジトリ」を選択して【リポジトリの作成】をクリックします。

![FunctionCompute_90017.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/dae6887c-8384-f58d-fb53-1fbcadeb6875.png)

**リポジトリ作成後に表示される詳細の【VPC】の項目はチュートリアルで利用する為、「コピー」リンクを押した後、テキストファイルに貼り付けて完全な表記を確認して上で控えておいてください**

![FunctionCompute_90018.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/c16ff64c-f54f-8d23-e304-ff2b5143fad4.png)

#### 4. ECSインスタンスの作成

##### 4.1. ECSインスタンスの立ち上げ

ECSインスタンスは[AWSエンジニアが学習するAlibaba Cloud【Function Compute編 (5)】](https://qiita.com/junk87/items/a44670c6fb93b1ce7f82)と同様のものを構築してください。

OSについてはCentOS Stream9前提で手順を進めていきます。

##### 4.2. ECSインスタンスの接続

ECS管理コンソールのインスタンス詳細画面にて【接続】を選択後、接続とコマンド画面にて
「ワークベンチ（デフォルト）」の【今すぐサインイン】をクリックします。

![ECS_60004.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/e9063b44-9469-dcb4-e88a-d5d7f0fdd02d.png)

InstanceLogin画面にてECSインスタンス立ち上げ時に入力したrootパスワードをPasswordの箇所へ入力後、【OK】を選択します。

![ECS_50013.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/93ec6532-0ad5-dd05-6b28-a60084cbd24b.png)

ECS管理コンソールからターミナルへ接続できたことを確認します。

![ECS_50014.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74171/f3e503f6-a69d-4221-7583-006c38b33e30.png)

#### 5. Dockerのインストール

##### 5.1. Dockerインストール

ターミナル上より以下のコマンドを実行してDockerをインストールします。

```bash:コマンド実行
curl https://download.docker.com/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker-ce.repo
sed -i -e "s/enabled=1/enabled=0/g" /etc/yum.repos.d/docker-ce.repo
dnf --enablerepo=docker-ce-stable -y install docker-ce
systemctl enable --now docker
```

##### 5.2. Dockerインストール確認

ターミナル上より以下のコマンドを実行してDockerのインストール確認を行います。

```bash:コマンド実行(インストール確認)
rpm -q docker-ce
```

```bash:コマンド実行結果(インストール確認) ※表示例
docker-ce-24.0.3-1.el9.x86_64
```

ターミナル上より以下のコマンドを実行してDocker起動確認を行います。

```bash:コマンド実行(Docker起動確認)
docker version
```

```bash:コマンド実行結果(Docker起動確認) ※表示例
Client: Docker Engine - Community
 Version:           24.0.3
 API version:       1.43
 Go version:        go1.20.5
 Git commit:        3713ee1
 Built:             Wed Jul  5 20:46:29 2023
 OS/Arch:           linux/amd64
 Context:           default

Server: Docker Engine - Community
 Engine:
  Version:          24.0.3
  API version:      1.43 (minimum version 1.12)
  Go version:       go1.20.5
  Git commit:       1d9c861
  Built:            Wed Jul  5 20:44:56 2023
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.6.21
  GitCommit:        3dce8eb055cbb6872793272b4f20ed16117344f8
 runc:
  Version:          1.1.7
  GitCommit:        v1.1.7-0-g860f061
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0
```

#### 6. ServerlessDevsのインストールおよび初期設定

##### 6.1 ServerlessDevsのインストール

ターミナル上より以下のコマンドを実行してnode.jsおよびServerless Devs developer toolsを導入します。

```bash:コマンド実行
yum install -y nodejs
npm install @serverless-devs/s -g
```

##### 6.2 ServerlessDevsの初期設定

ターミナル上より以下のコマンドを実行してServerlessDevsの初期設定を行います。

```bash:コマンド実行
s config add
```

上記コマンド実行後、下記内容を設定します。

- ? Please select a provider: (Use arrow keys)
    - Alibaba Cloud (alibaba) を選択
- ? Refer to the document for alibaba key:  http://config.devsapp.net/account/alibaba
    - ? AccessKeyID:  [AWSエンジニアが学習するAlibaba Cloud【Function Compute編 (2)】](https://qiita.com/junk87/items/aa19c264f835c20f40dd)で作成済のAccessKeyIDを入力
    - ? AccessKeySecret: [AWSエンジニアが学習するAlibaba Cloud【Function Compute編 (2)】](https://qiita.com/junk87/items/aa19c264f835c20f40dd)で作成済のAccessKeySecretを入力
- ? Please create alias for key pair. If not, please enter to skip default
    - エンターを押してスキップ(defaultを選択)

上記設定完了後、ターミナル上に設定内容および「Configuration successful」が表示されていることを確認します。


## ■ Next Time

今回で事前準備が終わりましたので次回は「Serverless DevsとFunction ComputeのGPUインスタンスを使った画像合成」を実施します。