Function ComputeでさくっとStable Diffusion API環境を立ち上げてみる

## はじめに

これは[Alibaba CloudのkubernetesやServerless製品（SAEなど）でサービス立ち上げてみよう by Alibaba Cloud Advent Calendar 2023](https://qiita.com/advent-calendar/2023/alibaba1) の記事です。
私は日頃からAlibaba Cloudによるソリューションや開発手法、展開に取り組んでおり、日々中国や全世界から最先端の技術取得に励んでいます。
**そうした活動をもっと外部へと発信していこう**と始めたのがこのAdventCalendarです。メンバー一人一人が書いた記事を通して、少しでも多くの方にAlibaba Cloudの興味を持って頂ければ幸いです。
さて、本記事は**Function ComputeでさくっとStable Diffusion API環境を立ち上げてみる話**です。

StableDiffusionのAPIサーバを立ち上げたいけど、通常の仮想サーバだと、使ってない時間帯でも課金してしまうなどコスパが悪いと思います。そのため、Function Computeを使って、Stable Diffusion APIサーバをクイックに立ち上げてみます。

## このチュートリアルについて

### 対象となる方: 

このガイドは、次の方を対象としています。
- Alibaba Cloud, Function Compute に関する基本的な知識を持つこと

### 前提条件:

- Alibaba cloud アカウントを持つこと
- Alibaba CloudでFunction Computeを有効化していること


## Alibaba Cloud Function Computeでアプリケーションを構築

Function Computeで、Application画面へ遷移し、新規プロジェクトを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355017/01a3e4b2-44c0-0448-dce1-573de5b48286.png)

Alibaba CloudのFunction Computeで嬉しいのが、テンプレートによる素早いデプロイができることです。FunctionComputeには様々なテンプレートが備えており、目的に応じた構築・運用をすることができます。
Application 画面にて、 「stable-diffusion-api」と入れると、`fc-stable-diffusion-api` というテンプレートが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355017/6fc198d6-64d0-c5bb-c750-f9373263f890.png)


`Create Now` をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355017/45c56868-521b-421b-d698-bd86dc2d62a0.png)


Function Computeは、テンプレートをデプロイする際、2つの方法を提供しています。
- Deploy from Code Repository：アプリケーションを作成する際、指定したコードのrepository、テンプレートの同期、アプリケーションの作成、環境の作成、パイプラインの配置設定などのStepが含まれます。

- Directly Deploy：直接デプロイなので、コードは自動的にオンラインにデプロイすることができます。プロジェクトを保守または更新する場合は、機能リソースを手動で管理する必要があります。

＜参考＞
Manage applications
https://www.alibabacloud.com/help/en/fc/manage-applications

今回は後者なので、`Deployment Type` で `Directly Deploy` を選定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355017/a95c7a91-3b0a-969d-a07b-640db6165ed1.png)



Role Name で、Authorize、新たな認可を与えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355017/8d002cdb-62e7-967f-3a6e-32ff0f5f7997.png)

`Confirm Authorization Policy` ボタンをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355017/b4c82585-ccb6-7882-3fc7-798106ba592f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355017/35c2b6d7-502d-d4f6-15f6-636418993300.png)

Regionを選定します。今回は日本Regionを選びます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355017/644a5365-5f5b-1de3-496e-9888831cbff0.png)

rawing typeを選定します。これローカライズされてないので、少し行き詰まっていましたが、会社の中国語ネイティブ同僚に聞いたら、以下の選択肢は次の意味のようです。

- 动漫风格⇒アニメスタイル
- 真人风格⇒実生活スタイル
- 轻量版⇒ライト版

今回はアニメスタイル、`动漫风格` を選定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355017/b567fa17-d6cd-8f42-7031-96ef1d491c25.png)


このまま下へスクロールすると、「選択したアプリケーションには追加のパーミッションが必要です： AliyunFCFullAccess。」　とエラーが発生しています。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355017/6808cf65-23ce-6b1c-f74f-60b6521bf1e3.png)

ここは「Add Policy」ボタンをクリックしながら、`AliyunFCFullAccess` を追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355017/f34dab34-e725-e561-b72f-13c792e8e2b6.png)

すると、別ページ（RAMロール設定）へ飛ばされますが、ここも`Confirm Authorization Policy` ボタンをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355017/c324350c-dd1c-fe83-66b6-87d2f9546bac.png)

そうすることで、再度FCのページに戻りますので、設定を続けます。
ここまでの設定が問題なければ、`Create and Deploy Default Environment` ボタンをクリックし、デプロイさせます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355017/d7d5d4ca-6e6d-19bb-106c-9c3d4f3127e1.png)

進捗ステータスが表示されますが、すぐ終わります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355017/451af7cb-eb2e-4b1a-b106-cde425f3f9d4.png)

再度コンソールページとして表示されます。こちらは現在デプロイ中のステータスのようです。しばらく待ってみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355017/128b9006-65ab-9615-a62a-3c6b74bc272e.png)

デプロイが終わったようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355017/a8a399e7-441d-9ba0-48a2-e687938a7c00.png)

ログもきちんと確認できています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355017/17f44c46-a127-4124-3a79-6bb98c8d909b.png)

このにある、`http://sd.fc-stable-diffusion-api.xxxxxxxxxx.ap-northeast-1.fc.devsapp.net/` が、APIサーバのURLとなります。これをWebブラウザで開いてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355017/b230456f-8d7a-a010-0028-035662c33618.png)

これはどうもFastAPIなので、URLの端っこに「docs」を追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355017/bfc8c97d-e062-eb70-a7e7-7629b1de5971.png)

API一覧が表示されました。このAPI一覧を参考にしながら、Pythonによるコード作成をしてみます。

APIの詳細は先ほどのdocsから確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355017/8ac7ff94-839f-8f7f-9299-7c1e5c2983fe.png)


```Python
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355017/a1b037be-46d1-8c19-ae37-1c52467f0cfb.png)
import json
import base64
import requests


def submit_post(url: str, data: dict):
    return requests.post(url, data=json.dumps(data))


def save_encoded_image(b64_image: str, output_path: str):
    with open(output_path, 'wb') as image_file:
        image_file.write(base64.b64decode(b64_image))


if __name__ == '__main__':
    txt2img_url = r'http://sd.fc-stable-diffusion-api.xxxxxx.cn-hangzhou.fc.devsapp.net/sdapi/v1/txt2img'

    data = {'prompt': 'Flying dog and chasing cat',
            'negative_prompt': '',
            'sampler_index': 'DPM++ SDE',
            'seed': 1234,
            'steps': 20,
            'width': 512,
            'height': 512,
            'cfg_scale': 8}

    response = submit_post(txt2img_url, data)
    save_image_path = r'tmp.png'
    save_encoded_image(response.json()['images'][0], save_image_path)


```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355017/9cfe269f-22a8-2329-2f9f-df1c1e720241.png)


このコードを実行します。その結果、画像が返却・表示されました。
しかし、犬のほうで足が一本足りないのはなぜでしょうね。。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355017/c7d50e90-0840-79eb-e643-8833fcffe7af.png)

## さいごに
本記事ではFunction ComputeでさくっとStable Diffusion API環境を立ち上げてみる方法をご紹介しました。Function Computeは様々なテンプレートがあるため、この構築に30分もかからないと思いますので、Stable Diffusion API環境が欲しい方は参考にしてみるといいでしょう。