利用 Google Cloud Run 建置網站,佈署 FastAPI 環境

透過 Severless 技術來佈署網站以及 WEB API 環境可以更快速地進行開發工作。

優點是透過每次的 CI 佈署,第一時間可以獲得產品環境的 Feedback,對比起傳統的佈署方式 ( 需要維護應用程式的基礎架構,包含伺服器、資料庫等 ), 不必考慮基礎架構的維護和擴展,只需要專注在撰寫應用程式。

缺點 : 服務是需要付費的。 但透過彈性的計費方式,閒置時不會產生額外成本,對於多產品、少流量的模式來說也許是更有效的資源運用模式。

如何佈署到 Cloud Run 上

0. 建立 main.py

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def read_root():
return {"Hello": "World"}

if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8000)

1. 建立 requirements.txt 並放入以下內容

fastapi==0.96.0
uvicorn==0.22.0

2. 建立 Dockerfile

GCR 背後的技術有一部分其實就是 Docker,如果熟悉 Docker 的話,可以很快速地利用GCR。


FROM python:3.11-slim
ENV PYTHONUNBUFFERED True
ENV APP_HOME /app
WORKDIR $APP_HOME
COPY . ./

RUN pip install --upgrade pip
COPY requirements.txt .
RUN pip install -r requirements.txt

EXPOSE 8080

CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8080"]

Google Cloud Run 預設使用 Port : 8080。

第一次環境佈署所需要的檔案就這三個,main.py、Dockerfile、requirements.txt。

佈署到 Google Cloud Run

安裝 gcloud command line

gcloud 是 Google Cloud Platform 的命令行工具,它提供了一個簡單的方法來管理您在 GCP 上的資源。以下是安裝和使用 gcloud 的基本步驟:

前往 Google Cloud SDK 官方網站 下載對應作業系統的安裝檔案。

安裝 Cloud SDK,按照安裝提示進行操作,並選擇您需要安裝的元件。您可以在安裝過程中選擇安裝 gcloud CLI。

安裝完成後,在終端或命令提示字元中輸入 gcloud --version 檢查安裝是否成功。

gcloud 基礎設定

  • gcloud init:初始化 gcloud CLI,該指令會提示登錄 Google 帳戶,並選擇您要使用的 GCP 項目。
  • gcloud config set project PROJECT_ID:設定 GCP Project ID,以便 gcloud CLI 與該項目交互使用。
  • gcloud auth login:登錄 Google 帳戶。

透過 gcloud 佈署

gcloud run deploy fastapi-app --source .

選擇佈署區域與允許部署:

我個人都是選擇 [1] ,將網站建置在台灣區。

這樣就可以將 FastAPI 應用程式成功佈署到 Google Cloud Run 上了。

現在無須手動將 Docker 映像檔上傳到 Google Artifact Registry,在執行 gclou deploy 時就會幫忙上傳 cloud storage & Registry 中了,但需要注意記得定期清理 cloud storage(佈署一次一個檔案),否則會收儲存費用。

測試是否正常運行

若佈署成功的話,會在 Terminal Console 中看到網址,點下去就可以成功訪問網站囉!

感想

Google Cloud Run 是一個功能強大的 Severless 平台,可以幫助開發人員快速地佈署和運行容器化應用程式,同時提供高可用性、可靠性和安全性。

關於對應的建置,其實 Google Cloud Run 省去了很多麻煩,相對應的也少掉了很多後端所需要的知識,比如說像 Docker 的建置、 CORS 設定等,如果不熟的開發者,可能在設定上,會遇到不少問題,但對應的討論以及除錯的討論串是比較少的。

AutoEncoder 自動編碼器來建構生成模型

AutoEncoder 自動編碼器來建構生成模型

對於像是把一個數字變成一個影像的作法,通常是透過生成模型來達成, AutoEncoder 自動編碼器則是深度學習中常見最簡易的生成模型。

AutoEncoder 的運作原理

AutoEncoder 是透過一個 Encoder 編碼器與一個 Decoder 解碼器的組合來實作生成模型的機制。

編碼的過程有點像是將資料濃縮、擷取,降維到較小維度的空間,而解碼則是相反的過程,類似於將較小維度空間的資料重建、還原、升維到原始維度的空間。

在 AI 的領域中,這種濃縮的資訊通常以 z 來表示, z 所存在的空間稱為潛在空間。

AutoEncoder 的架構圖

AutoEncoder 模型在訓練好之後,只需要將 Encoder 移走,透過給予 Decoder 解碼器隨機潛在空間的值,就可以生成所需要的影像。

換句話說,在 AutoEncoder (AE) 架構中,通常最後在使用的部分都是已經訓練完成的 Decoder 解碼器 。

[閱讀全文…]

AutoKeras 的模型搜尋行為

AutoKeras 之所以方便使用而且將 AI 的模型訓練降低門檻到幾乎人人都可以上手,主要就是在於自動化的進行模型搜尋,透過自動化的方式去尋找、找出最合適的演算法跟模型來訓練 AI。 而這也就是 AutoKeras 的命名來源,取代原本需要透過資料工程師手動的調教、訓練模型。

AutoKeras 是如何進行模型的搜尋行為的 ?

[閱讀全文…]

AutoKeras 可接受的輸入資料格式

AutoKeras 模型一般可以接受輸入下面四種類型的資料

Numpy 陣列 (ndarray)

Numpy、scikit-Learn、Tensorflow 等 Python 套件都採用的陣列,只要電腦的記憶體可以容納得下你的資料,儲存成 ndarray 是最便利的選擇。

Pandas 的 Series/ DataFrame 物件

Pandas 也是常用的資料套件,可以用來載入 CSV、Excel 資料表,其中內建的 DataFrame 可以直接輸入給 AutoKeras 模型不需要額外轉換成 Numpy 物件。

TensorFlow Core 資料集

可以直接透過TensorFlow Core 中的預設 Module資料集下載資料並直接傳給 AutoKeras 圖形分類器訓練,這種形式的資料集相對比較少,但所有的資料集都已經預處理好了,很適合學習使用。

預設資料集列表
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
import autokeras as ak

from tensorflow.keras.datasets import mnist
from tensorflow.keras.models import load_model

(x_train, y_train) , (x_test, y_test) = mnist.load_data()

print(x_train.shape)
# 建立圖形分類器
clf = ak.ImageClassifier(max_trials = 1)

# 開始訓練圖形分類器
clf.fit(x_train, y_train, epochs = 10)

# 使用測試集評估模型的預測效果, 會回傳預測的準確率
clf.evaluate( x_test, y_test )
可以利用機器的 GPU 加速訓練的速度

TensorFlow 資料集

有許多公開的資料集可以用來學習以及練習,這個有點類似 Python 生成器,能以串流形式從硬碟檔案或分散式檔案系統傳入資料,因此很適合用在深度學習與大型的資料集。

TensorFlow DataSets 官方內建資料集列表

基本上大型的資料集,比較建議先將資料轉換成 TensorFlow Dataset,也就是將自己的資料寫成 TensorFlow 資料集的格式,官方的文件有詳細的作法,可以參考

將資料轉換成 TensorFlow 資料集有幾個好處 :

  • 可以非同步預處理與建立資料佇列。
  • 提供 GPU 記憶體資料預載,所以在GPU處理完前一批資料後,可以直接使用下一批。
  • 可以從多種不同的資料源載入資料 ex. CSV 、Numpy、文字檔、資料夾等

使用前請先記得安裝 package

使用 TensorFlow Datasets 的下載方式與上面的稍微有些不同,下面是參考的範例程式碼

import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt

import tensorflow_datasets as tfds
import autokeras as ak

mnist_train, mnist_test = tfds.load('mnist', split=["train","test"], as_supervised=True)

ak0 = ak.ImageClassifier(num_classes=10, max_trials=1)
ak0.fit(mnist_train, epochs=10)

# 使用測試集評估模型的預測效果, 會回傳預測的準確率
ak0.evaluate( mnist_test )

神經網路模型的資料預處理

如果要使用 AutoKeras 這個深度學習的框架,對於資料集的預處理是非常重要的。現有的許多資料集為了學習方便,在下載時往往已經有人幫你預處理完畢,讓學習的過程中不用再去處理瑣碎繁瑣的預處理,整理下面幾種常見的資料預處理方法。

為什麼資料正規化 Normalization 會讓模型的表現較好 ?

[閱讀全文…]