サーバー側のスクリプト
start_engin.sh
#!/bin/bash
# USIエンジンをネットワークソケットで公開するサンプルスクリプト
# ===== 設定 =====
ENGINE_DIR="/path/to/engine_directory" # エンジンのディレクトリパスに変更してください
ENGINE_BINARY="your_engine_binary" # エンジンの実行ファイル名に変更してください
ENGINE_OPTIONS="" # 必要に応じてエンジンオプションを設定してください
SOCKET_PORT=6000 # 公開するポート番号
echo "ネットワークソケットでUSIエンジンを公開します: $ENGINE_DIR/$ENGINE_BINARY"
# ===== 初期処理 =====
# 指定されたエンジンディレクトリに移動
cd "$ENGINE_DIR" || { echo "エンジンディレクトリに移動できませんでした。"; exit 1; }
# ===== エンジン公開 =====
# socat を利用して、TCPソケット経由でエンジンを公開
# bind=<your_ip_address> の部分は、適切なIPアドレスに置き換えてください
socat TCP-LISTEN:$SOCKET_PORT,reuseaddr,bind=<your_ip_address>,fork,keepalive EXEC:"./$ENGINE_BINARY $ENGINE_OPTIONS",pty,raw,echo=0
# 以下は、PORT番号を変数で指定する例です(コメントアウト済み)
# socat TCP-LISTEN:$SOCKET_PORT,reuseaddr EXEC:"./$ENGINE_BINARY $ENGINE_OPTIONS",pty,raw,echo=0
ShogiDroid側のスクリプト
REMOTE_ENGINE_arm64-v8a
#!/system/bin/sh
# Manual SSH Bridge Engine (サンプル版)
# リモートエンジンへの直接接続ブリッジ
# ===== 設定 =====
# 機密情報を含まないプレースホルダーに置き換えています
CONFIG_DIR="/path/to/config"
LOG_FILE="$CONFIG_DIR/manual_bridge.log"
REMOTE_HOST="your.remote.host" # 接続先のホスト名またはIPアドレスに置き換えてください
SOCKET_PORT=6000 # 接続先ポート(必要に応じて変更してください)
# ===== 初期化 =====
# 設定ディレクトリを作成(既に存在している場合はエラー出力を無視)
mkdir -p "$CONFIG_DIR" 2>/dev/null
# ログの初期化
echo "Manual SSH Bridge Engine started at $(date)" > "$LOG_FILE"
echo "PID: $$" >> "$LOG_FILE"
# ===== ヘルパー関数 =====
# 指定したリモートホストとポートの接続状況をチェックする関数
check_remote_socket() {
if command -v nc >/dev/null 2>&1; then
if nc -z $REMOTE_HOST $SOCKET_PORT 2>/dev/null; then
echo "Remote socket $REMOTE_HOST:$SOCKET_PORT is open" >> "$LOG_FILE"
return 0
else
echo "Remote socket $REMOTE_HOST:$SOCKET_PORT is closed" >> "$LOG_FILE"
return 1
fi
else
echo "nc command not found, cannot check socket" >> "$LOG_FILE"
return 1
fi
}
# ===== ソケット通信処理 =====
# 利用可能な通信ツールを使用してリモートエンジンに接続する関数
connect_to_engine() {
# 接続前にリモートホストのポートをチェック
if ! check_remote_socket; then
echo "Error: Cannot connect to remote engine" >> "$LOG_FILE"
return 1
fi
# 接続試行の情報をログに記録
echo "Connecting to remote engine at $REMOTE_HOST:$SOCKET_PORT" >> "$LOG_FILE"
# 利用可能なツールを判定して接続
if command -v socat >/dev/null 2>&1; then
echo "Using socat for connection" >> "$LOG_FILE"
exec socat STDIO TCP:$REMOTE_HOST:$SOCKET_PORT >> "$LOG_FILE" 2>&1
elif command -v nc >/dev/null 2>&1; then
echo "Using netcat for connection" >> "$LOG_FILE"
exec nc $REMOTE_HOST $SOCKET_PORT
else
echo "Error: No suitable connection tool found" >> "$LOG_FILE"
return 1
fi
}
# ===== メイン処理 =====
echo "Manual SSH Bridge Engine starting..." >> "$LOG_FILE"
# リモートエンジンへの接続を試行
connect_to_engine
echo "Manual SSH Bridge Engine terminated" >> "$LOG_FILE"
exit 0
Shellスクリプトですが,さも実行ファルのように名前を書き換えないとShogiDroidが反応してくれません.
ディレクトリの例
.
└── /home/ubuntu/
├── hege/
│ └── start_engine.sh #起動ファイル
└── Suisho5/
├── YaneuraOu-by-gcc # 実行ファイル
├── eval/nn.bin
└── book/foo
.
└── ShogiDroid/
└── engine/
└── REMOTE_ENGINE/
└── REMOTE_ENGINE_arm64-v8a
結果
スマホ上で1億2千万NPS(Suisho10beta2)出るAIが手に入ります.たのしい😀
⚠️注意⚠️
- AWSはスポットインスタンスで取らないとすごい請求になりかねません.切り忘れなどになんらかの対策は取っておきましょう(とはいえ,エンジンを起動するたびにスポットリクエストするとすごく遅いです…いい感じにやってください)
- AWS側のポート(上の例なら6000) は開けておいてください.セキュリティは知りません.
- 本当にShogiDroidで192スレッド動かそうとすると,動きますがShogiDroidがUSI_Hashを勝手に4096MBに制限するせいで大変もったいないです.ここをどうにかしたければ,アプリをゴニョゴニョするなりしてください(責任は負いません)
- ShogiHomeのAndroid版ほしい!オープンソースなので,やる気のある人がいらっしゃれば,手伝えることがあれば教えてください!