介绍

我在 GCP 上做了一个简单的应用程序,计算和可视化将棋比赛记录文件(csa 格式文件)的评估值。

仍然存在模型精度不好、由于某种原因使用matplotlib进行可视化、图形不交互等问题。 将棋の棋譜を解析して評価値を可視化してくれるアプリを作った

在这篇文章中找出

这篇文章没有告诉你的

  • 关于将棋
    • 由于几乎没有提到将棋,所以没有解释。只要你明白这是两个人玩的棋盘游戏就没有问题。
  • 关于将棋 AI
  • 关于板评估的 DNN
    • 我用作研究参考的代码在本书中。如何创建强大的将棋软件 | Mynavi Books

我已将代码放在下面
https://github.com/TatsuyaSSK/shogi-ai

整体图

整个应用程序的图片如下。

作为前提,这个应用程序是在 GCP 上制作的,看起来像上面的视频是在 GCE(谷歌计算引擎)上设置的流光服务器,这是一个预测评估值的服务环境,是用 Vertex AI 构建的。
将棋の棋譜を解析して評価値を可視化してくれるアプリを作った

申请流程如下。

  • 在streamlit的文本输入栏中输入包含csa格式的比赛记录的文件的路径
    • 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(谷歌云存储)中。
  • 将存储在 GCS 上的 csa 文件的路径传递给顶点 AI 准备的端点
  • 顶点AI以列表形式返回某条游戏记录的评价值
    • 取值范围从0到1,列表的长度由位置数决定。
  • 使用 streamlit 可视化评估结果

由于流光和顶点 AI 在这个应用程序中发挥着核心作用,我将把它们分成两部分并更详细​​地解释它们。

我们在 Streamlit 方面所做的事情

代码的主文件是上述存储库中 app 目录中的 shogi.py。

啊页。 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 进行预测的地方

ゔてx_爱。 py
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。

守基。 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

相关文章:

  • 2021-06-30
  • 2022-12-23
  • 2021-12-24
  • 2022-12-23
  • 2022-02-09
  • 2021-10-06
  • 2022-12-23
  • 2021-12-05
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-05-30
  • 2021-11-22
相关资源
相似解决方案