介绍
我在 GCP 上做了一个简单的应用程序,计算和可视化将棋比赛记录文件(csa 格式文件)的评估值。
仍然存在模型精度不好、由于某种原因使用matplotlib进行可视化、图形不交互等问题。
在这篇文章中找出
- 如何使用 streamlit 制作应用程序
- 如何在顶点 AI 中提供自定义模型
dhirooka 的文章什么时候谷歌云日本的文章非常感谢您的帮助。
这篇文章没有告诉你的
- 关于将棋
- 由于几乎没有提到将棋,所以没有解释。只要你明白这是两个人玩的棋盘游戏就没有问题。
- 关于将棋 AI
- 关于板评估的 DNN
- 我用作研究参考的代码在本书中。如何创建强大的将棋软件 | Mynavi Books
我已将代码放在下面
https://github.com/TatsuyaSSK/shogi-ai
整体图
整个应用程序的图片如下。
作为前提,这个应用程序是在 GCP 上制作的,看起来像上面的视频是在 GCE(谷歌计算引擎)上设置的流光服务器,这是一个预测评估值的服务环境,是用 Vertex AI 构建的。
申请流程如下。
- 在streamlit的文本输入栏中输入包含csa格式的比赛记录的文件的路径
- csa 文件的内容如下所示,您在第一次和第二次移动时所击中的位置和内容将逐行存储。这使得再现位置成为可能,因此它可以用于生成每个位置的评估值
'Shogi Quest
N+tonnkotu(1713)
N-kyuubou1(1802)
P1-KY-KE-GI-KI-OU-KI-GI-KE-KY
P2 * -HI * * * * * -KA *
P3-FU-FU-FU-FU-FU-FU-FU-FU-FU
P4 * * * * * * * * *
P5 * * * * * * * * *
P6 * * * * * * * * *
P7+FU+FU+FU+FU+FU+FU+FU+FU+FU
P8 * +KA * * * * * +HI *
P9+KY+KE+GI+KI+OU+KI+GI+KE+KY
+
+2726FU
-3334FU
+3948GI
-8384FU
+7968GI
-8485FU
+6978KI
-7162GI
+5969OU
-8586FU
+8786FU
-8286HI
+0087FU
-8682HI
+9796FU
-9394FU
+4746FU
-5142OU
+4847GI
-3132GI
+3736FU
-6364FU
- 按下“计算评估值”按钮时,根据输入文件路径获取csa文件并保存在GCS(谷歌云存储)中。
- 将棋游戏记录将棋任务历史搜索测试版我从网站上得到它。将棋应用程序称为 Shogi Quest 的游戏记录保存在这里。
- 将存储在 GCS 上的 csa 文件的路径传递给顶点 AI 准备的端点
- 顶点AI以列表形式返回某条游戏记录的评价值
- 取值范围从0到1,列表的长度由位置数决定。
- 使用 streamlit 可视化评估结果
由于流光和顶点 AI 在这个应用程序中发挥着核心作用,我将把它们分成两部分并更详细地解释它们。
我们在 Streamlit 方面所做的事情
代码的主文件是上述存储库中 app 目录中的 shogi.py。
import streamlit as st
import numpy as np
import matplotlib.pyplot as plt
import japanize_matplotlib
import os
from utils import check_input_text, get_player_names
from get_kif_file import CsaFetcher
from vertex_ai import evaluate
st.title("将棋アプリ解析君")
text = st.text_input("csaファイルのURLを入力してください")
submit_button = st.button(label="評価値を計算する")
if submit_button:
csa_file_url = check_input_text(text)
csa_file_name = os.path.basename(csa_file_url)
bucket_name = "sasaki-sample"
csa_fetcher = CsaFetcher(bucket=bucket_name)
csa_fetcher.fetch_csa_file(url=csa_file_url, upload_dir_path="")
gcs_csa_file_path = f"gs://{bucket_name}/{csa_file_name}"
evaluate_values = evaluate(gcs_csa_file_path)
first_player_name, second_player_name = get_player_names(csa_file_url)
# 描画
fig, ax = plt.subplots(figsize=(12, 5))
x = list(range(1, len(evaluate_values) + 1))
ax.plot(x, evaluate_values)
index = np.arange(0, len(evaluate_values) + 1, step=10).tolist()
x_label = [f"{num}手目" for num in index]
ax.set_xticks(index)
ax.set_xticklabels(x_label)
ax.axhline(y=0.5, lw=0.3, color="red")
ax.set_title(f"先手:{first_player_name} 後手:{second_player_name}")
plt.tight_layout()
st.pyplot(fig)
在streamlit中,您可以通过编写st.xxxxx轻松显示各种小部件。
这一次,我们使用 st.title、st.text_input 和 st.button。如果你写 st.title(“xxxxx”),标题会很容易显示。
用st.button创建一个按钮,当按钮被按下时,if语句之后的处理就会运行。 (我不确定这是否是正确的写法,所以我希望专家告诉我。)
我正在做的是
- 获取 csa 文件,存储在 GCS 中
- 向顶点 AI 投掷预测
- 可视化
变成。
Vertex_ai.py 是你对顶点 AI 进行预测的地方
from google.cloud import aiplatform
import streamlit as st
PROJECT_ID = "kif-kaiseki-kun-project"
LOCATION = "asia-northeast1"
ENDPOINT_ID = "7618190613418082304"
def evaluate(csa_file_path):
client_options = {"api_endpoint": f"{LOCATION}-aiplatform.googleapis.com"}
client = aiplatform.gapic.PredictionServiceClient(client_options=client_options)
endpoint = client.endpoint_path(
project=PROJECT_ID, location=LOCATION, endpoint=ENDPOINT_ID
)
instances = [{"csa_file_path": csa_file_path}]
response = client.predict(endpoint=endpoint, instances=instances)
evaluate_values_before = response.predictions[0]["evaluate_value"]
evaluate_values = []
for index, evaluate_value in enumerate(evaluate_values_before, 1):
if index % 2 == 0: # 偶数の場合、後手の評価値を1から引いて、全て先手の評価値に直す
first_player_value = 1 - evaluate_value
evaluate_values.append(first_player_value)
else:
evaluate_values.append(evaluate_value)
return evaluate_values
获得必要的代码和库后,准备下面的 Dockerfile。这个没什么好说的,直接在CMD中启动streamlit server即可。
FROM python:3.7-slim
COPY requirements.txt ./requirements.txt
RUN pip install -r requirements.txt
ENV APP_HOME /app
WORKDIR $APP_HOME
COPY . ./
CMD streamlit run app/shogi.py --server.port 80
Dockerfile 准备好后,创建一个 Docker 镜像并将创建的镜像注册到 Container Registry(GCP 上的 Docker 镜像管理服务)。
docker build . -t shogi-ai-streamlit
docker tag shogi-ai-streamlit gcr.io/kif-kaiseki-kun-project/shogi-ai-streamlit
docker push gcr.io/kif-kaiseki-kun-project/shogi-ai-streamlit
* 要在容器注册表中注册,您需要遵循以下身份验证过程,以便 Docker 可以与 gcloud 一起使用。https://cloud.google.com/sdk/gcloud/reference/auth/configure-docker
$ gcloud auth login // GCP自体の認証 (Google認証)
$ gcloud auth configure-docker // gcloudでDockerが使えるよう認証
查看 Container Registry 可以看到 Docker 镜像是这样注册的。
确认后,使用此容器在 GCE 上设置实例。由于实例创建一栏有“DEPLOY CONTAINER”,点击这里,
设置访问权限和防火墙设置如下(最好单独设置访问范围,以免添加不必要的权限。我这次跳过了)
现在按下创建实例并等待一段时间,实例将被启动。如果您从外部 IP 访问,您将看到启动 streamlit 的屏幕
*由于某种原因,即使在实例启动后,流光屏幕也需要几分钟才能出现。让我们耐心等待(如果你知道原因,我想知道)
我们在 Vertex AI 方面所做的事情
代码的主文件是上述存储库中服务目录中的 shogi.py。
import json
import numpy as np
from google.cloud import storage
from cshogi import CSA, Board
import torch
from features import FEATURES_NUM, make_input_features
from policy_value_resnet import PolicyValueNetwork
from features import (
FEATURES_NUM,
make_input_features,
)
from flask import Flask, request, Response, jsonify
model = PolicyValueNetwork()
device = torch.device("cpu")
model.to(device)
model_weight = torch.load("checkpoints_checkpoint-004.pth", map_location=device)
model.load_state_dict(model_weight["model"])
model.eval()
# ここからflaskの設定
app = Flask(__name__)
# flask route for liveness checks
@app.route("/healthcheck")
def healthcheck():
status_code = Response(status=200)
return status_code
# flask route for predictions
@app.route("/predict", methods=["GET", "POST"])
def predict():
request_json = request.get_json(silent=True, force=True)
data = request_json["instances"]
csa_file_path = data[0]["csa_file_path"]
csa_file_path_splitted = csa_file_path.split(
"/"
) # bucket名とfile名の取得のためfile_pathを分割している gs://bucket_name/file_nameを仮定
bucket_name = csa_file_path_splitted[2]
file_name = csa_file_path_splitted[3]
storage_client = storage.Client()
bucket = storage_client.get_bucket(bucket_name)
blob = storage.Blob(file_name, bucket)
content = blob.download_as_text()
kif = CSA.Parser.parse_str(content)[0]
board = Board()
move_num = len(kif.moves)
# 出力用の配列
torch_features = torch.empty(
(move_num + 1, FEATURES_NUM, 9, 9),
dtype=torch.float32,
device=torch.device(device),
)
# make_input_featuresがnumpyでしか動作しないのでnumpy型に変換
np_features = torch_features.numpy()
# 初期局面の特徴量を生成
make_input_features(board, np_features[0])
# 1手目から終局までの特徴量を生成
for i, move in enumerate(kif.moves):
board.push(move)
make_input_features(board, np_features[i + 1])
_, y = model(torch_features)
# Tensorをnumpyに変換
y = y.to("cpu").detach().numpy().copy()
# 次元を削減
y = np.squeeze(y)
# シグモイドで出力する
result = 1 / (np.exp(-y) + 1)
result = result.tolist() # numpy.ndarrayはjsonでシリアライズできないのでリストに変換
# jsonでdump
return json.dumps({"predictions": [{"evaluate_value": result}]})
if __name__ == "__main__":
app.run(debug=True, host="0.0.0.0", port=8080)
Vertex AI 需要 HTTP 服务器来接受 Vertex AI 的 REST API 格式的请求。这次我使用flask 来设置HTTP 服务器。
有@app.route("/healthcheck") 和@app.route("/predict", methods=["GET", "POST"]),但是准备前一个路由的原因是Vertex AI Now,在为了检查HTTP服务器是否正常运行,向/healthcheck路由发送请求,检查是否返回status200。
后者用于预测,streamlit会向/predict路由发送一个POST请求,此时会执行预测。
我正在做很多事情,但我正在做的是获取存储在 GCS 中的 csa 文件的内容,从 csa 文件创建特征,并将它们传递给经过训练的模型。
创建必要的文件后,让我们创建一个 Docker 映像并将其注册到 Container Registry。
在Dockerfile中,这次的模型是pytorch,所以基础镜像是pytorch
* 当我尝试通过 pip 安装 pytorch 并构建 Docker 映像时,它失败了,所以我正在使用这种方法...我用 Vertex AI 尝试了 AnimeGAN我在完全相同的状态下尝试过,但是……原因仍然未知。
FROM pytorch/pytorch:latest
COPY requirements.txt ./requirements.txt
RUN pip install -r requirements.txt
COPY app.py ./app.py
COPY features.py ./features.py
COPY policy_value_resnet.py ./policy_value_resnet.py
COPY checkpoints_checkpoint-004.pth ./checkpoints_checkpoint-004.pth
# Expose port 8080
EXPOSE 8080
ENTRYPOINT ["python3", "app.py"]
docker build . -t shogi-ai
docker tag shogi-ai-streamlit gcr.io/kif-kaiseki-kun-project/shogi-ai
docker push gcr.io/kif-kaiseki-kun-project/shogi-ai
确保这也已在 Container Registry 中注册
然后将此自定义容器注册到 Vertex AI 作为模型。让我们注册之前从模型导入中创建的自定义容器。
注册模型后,我们需要做的最后一件事是提供一个可以向其发送请求的端点。添加端点模型并注册您之前创建的模型
一旦你创建了你的端点,你就完成了!尝试从 streamlit 发送请求,看看是否有效
综上所述
这一次,我解释了使用流光和顶点AI的游戏记录分析应用程序的概述,以及如何制作它。正如我在“介绍”中所写的,仍有部分可以改进,所以如果我有时间,我想尝试一下。
不幸的是,这次我不习惯模型训练的顶点管道,所以我还没有习惯。我想习惯顶点AI的其他服务,所以我想尝试各种东西。
原创声明:本文系作者授权爱码网发表,未经许可,不得转载;
原文地址:https://www.likecs.com/show-308624008.html