Go 用 SDK は、TensorFlow、PyTorch、文字列など、複数の入力形式と出力形式をラップし、キューサービスの非同期呼び出しをサポートします。このトピックでは、各 API について説明し、完全なコード例を提供します。
SDK のユースケースと呼び出しの原則については、「サービス呼び出し SDKs」をご参照ください。
前提条件
Go パッケージ管理ツールは、コンパイル時に SDK のコードを自動的にダウンロードします。事前に SDK をインストールする必要はありません。呼び出しロジックをカスタマイズする場合は、まずGo 向け SDK のコードをダウンロードしてから変更してください。
SDK をインポートするには、次のコードを使用します。
import (
"github.com/pai-eas/eas-golang-sdk/eas"
)クイックスタート
モデルの入力データフォーマットに合ったリクエストクラスを選択します。次の例は、文字列リクエストを使用した最小限のエンドツーエンド呼び出しを示しています。
package main
import (
"fmt"
"github.com/pai-eas/eas-golang-sdk/eas"
)
func main() {
client := eas.NewPredictClient("182848887922****.cn-shanghai.pai-eas.aliyuncs.com", "my_service")
client.SetToken("YOUR_SERVICE_TOKEN")
client.Init()
resp, err := client.StringPredict("[{}]")
if err != nil {
fmt.Printf("failed to predict: %v\n", err.Error())
} else {
fmt.Printf("%v\n", resp)
}
}API リファレンス
Go 用 SDK は、以下の API クラスを提供します。これらのクラスは、目的別に 3 つのグループに分類されています。
グループ | 説明 |
メインクライアント | PredictClient: サービス情報 (エンドポイント、サービス名、トークン) を設定し、リクエストを送信して、レスポンスを受信します。 |
入出力 |
|
キュー サービス |
|
PredictClient
サービス情報の設定、リクエストの送信、予測結果の受信に使用されるメインクライアントクラスです。
メソッド | 説明 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| PredictClient オブジェクトを初期化します。すべてのパラメーターを設定した後、 |
|
|
|
|
|
|
|
|
TFRequest
TensorFlow モデルの入力データを構築します。
メソッド | 説明 |
|
|
|
|
|
|
TFResponse
TensorFlow モデルからの出力データを解析します。
メソッド | 説明 |
|
|
|
|
TorchRequest
PyTorch モデルの入力データを構築します。
メソッド | 説明 |
| TorchRequest クラスのコンストラクターです。 |
|
|
|
|
TorchResponse
PyTorch モデルからの出力データを解析します。
メソッド | 説明 |
|
|
|
|
QueueClient
EAS キュー サービスと連携して、データの生成、消費、管理を行います。
メソッド | 説明 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
types.Watcher
キュー サービスのサブスクリプション チャネルからプッシュされたデータを読み取ります。
メソッド | 説明 |
|
|
| ウォッチャー オブジェクトとそのバックエンド データ接続を閉じます。 説明 クライアントが一度に持てるアクティブなウォッチャー オブジェクトは 1 つだけです。新しいウォッチャー オブジェクトを作成する前に、現在のウォッチャー オブジェクトを閉じる必要があります。 |
例
フォーマット別の同期推論
サービスの入出力タイプに基づいて、コードサンプルを選択してください。
文字列
カスタムプロセッサを使用してサービスをデプロイする場合、通常は文字列を使用して呼び出します。例えば、PMML モデルサービスを呼び出す場合などです。次のプログラムは、完全な例です。
package main
import (
"fmt"
"github.com/pai-eas/eas-golang-sdk/eas"
)
func main() {
client := eas.NewPredictClient("182848887922****.cn-shanghai.pai-eas.aliyuncs.com", "scorecard_pmml_example")
client.SetToken("YWFlMDYyZDNmNTc3M2I3MzMwYmY0MmYwM2Y2MTYxMTY4NzBkNzdj****")
client.Init()
req := "[{\"fea1\": 1, \"fea2\": 2}]"
for i := 0; i < 100; i++ {
resp, err := client.StringPredict(req)
if err != nil {
fmt.Printf("failed to predict: %v\n", err.Error())
} else {
fmt.Printf("%v\n", resp)
}
}
}TensorFlow
TensorFlow モデルの場合、入出力データフォーマットとして、それぞれ TFRequest と TFResponse を使用します。次のプログラムは、完全な例です。
package main
import (
"fmt"
"github.com/pai-eas/eas-golang-sdk/eas"
)
func main() {
client := eas.NewPredictClient("182848887922****.cn-shanghai.pai-eas.aliyuncs.com", "mnist_saved_model_example")
client.SetToken("YTg2ZjE0ZjM4ZmE3OTc0NzYxZDMyNmYzMTJjZTQ1YmU0N2FjMTAy****")
client.Init()
tfreq := eas.TFRequest{}
tfreq.SetSignatureName("predict_images")
tfreq.AddFeedFloat32("images", []int64{1, 784}, make([]float32, 784))
for i := 0; i < 100; i++ {
resp, err := client.TFPredict(tfreq)
if err != nil {
fmt.Printf("failed to predict: %v", err)
} else {
fmt.Printf("%v\n", resp)
}
}
}PyTorch
PyTorch モデルの場合、入出力データフォーマットとして、それぞれ TorchRequest と TorchResponse を使用します。次のプログラムは、完全な例です。
package main
import (
"fmt"
"github.com/pai-eas/eas-golang-sdk/eas"
)
func main() {
client := eas.NewPredictClient("182848887922****.cn-shanghai.pai-eas.aliyuncs.com", "pytorch_resnet_example")
client.SetTimeout(500)
client.SetToken("ZjdjZDg1NWVlMWI2NTU5YzJiMmY5ZmE5OTBmYzZkMjI0YjlmYWVl****")
client.Init()
req := eas.TorchRequest{}
req.AddFeedFloat32(0, []int64{1, 3, 224, 224}, make([]float32, 150528))
req.AddFetch(0)
for i := 0; i < 10; i++ {
resp, err := client.TorchPredict(req)
if err != nil {
fmt.Printf("failed to predict: %v", err)
} else {
fmt.Println(resp.GetTensorShape(0), resp.GetFloatVal(0))
}
}
}VPC 専用接続
VPC 専用接続を使用すると、EAS 専用リソースグループにデプロイされたサービスにのみアクセスでき、そのリソースグループを指定した vSwitch に接続する必要があります。EAS 専用リソースグループの購入とネットワークの接続方法については、「EAS リソースグループの使用」および「パブリックリソースまたは内部リソースにアクセスするための EAS の設定」をご参照ください。標準的な呼び出しと比較して、この方法では client.SetEndpointType(eas.EndpointTypeDirect) という 1 行のコードを追加するだけで済むため、高トラフィック、高同時実行のサービスに適しています。次のコードは一例です。
package main
import (
"fmt"
"github.com/pai-eas/eas-golang-sdk/eas"
)
func main() {
// VPC 専用接続エンドポイントのフォーマット: {uid}.vpc.{region-id}.pai-eas.aliyuncs.com。エンドポイントは、EAS コンソールのサービス詳細ページの [呼び出し情報] タブで確認できます。
client := eas.NewPredictClient("182848887922****.vpc.cn-shanghai.pai-eas.aliyuncs.com", "scorecard_pmml_example")
client.SetToken("YWFlMDYyZDNmNTc3M2I3MzMwYmY0MmYwM2Y2MTYxMTY4NzBkNzdj****")
client.SetEndpointType(eas.EndpointTypeDirect)
client.Init()
req := "[{\"fea1\": 1, \"fea2\": 2}]"
for i := 0; i < 100; i++ {
resp, err := client.StringPredict(req)
if err != nil {
fmt.Printf("failed to predict: %v\n", err.Error())
} else {
fmt.Printf("%v\n", resp)
}
}
}クライアント接続パラメーター
http.Transport プロパティを使用して、リクエストクライアントの接続パラメーターを設定できます。次の例に、これらの設定を構成する方法を示します。
package main
import (
"fmt"
"github.com/pai-eas/eas-golang-sdk/eas"
"net/http"
"time"
)
func main() {
// VPC 専用接続エンドポイントのフォーマット: {uid}.vpc.{region-id}.pai-eas.aliyuncs.com。エンドポイントは、EAS コンソールのサービス詳細ページの [呼び出し情報] タブで確認できます。
client := eas.NewPredictClient("182848887922****.vpc.cn-shanghai.pai-eas.aliyuncs.com", "network_test")
client.SetToken("MDAwZDQ3NjE3OThhOTI4ODFmMjJiYzE0MDk1NWRkOGI1MmVhMGI0****")
client.SetEndpointType(eas.EndpointTypeDirect)
client.SetHttpTransport(&http.Transport{
MaxConnsPerHost: 300,
TLSHandshakeTimeout: 100 * time.Millisecond,
ResponseHeaderTimeout: 200 * time.Millisecond,
ExpectContinueTimeout: 200 * time.Millisecond,
})
}キューサービス
QueueClient を使用して、キューサービスへのデータの送信、データクエリ、キューサービスのステータスのクエリ、およびキューサービスからのデータプッシュのサブスクライブができます。この例では、1 つのゴルーチンがキューサービスにデータを送信し、別のゴルーチンがウォッチャーを使用してそのデータをサブスクライブして受信します。
EAS で非同期推論サービスをデプロイすると、入力キューと出力キューが自動的に生成されます。アドレスは通常、次のフォーマットになります。
入力キュー: <domain>/api/predict/<service_name>
出力キュー: <domain>/api/predict/<service_name>/sink
要件に基づいて、<service_name> または <service_name>/sink を使用して QueueClient を構築します。
package main
import (
"context"
"fmt"
"strconv"
"time"
"github.com/pai-eas/eas-golang-sdk/eas"
"github.com/pai-eas/eas-golang-sdk/eas/types"
)
func main() {
const (
QueueEndpoint = "182848887922****.cn-shanghai.pai-eas.aliyuncs.com"
// 例えば、EAS サービス名が test_qservice の場合、入力キュー名は test_qservice、出力キュー名は test_qservice/sink です。
QueueName = "test_qservice"
QueueToken = "YmE3NDkyMzdiMzNmMGM3ZmE4ZmNjZDk0M2NiMDA3OTZmNzc1MTUx****"
)
queue, err := eas.NewQueueClient(QueueEndpoint, QueueName, QueueToken)
if err != nil {
fmt.Printf("Failed to create queue client: %v\n", err)
return
}
// キュー内のすべてのメッセージをトランケート
attrs, err := queue.Attributes()
if err == nil {
if index, ok := attrs["stream.lastEntry"]; ok {
idx, _ := strconv.ParseUint(index, 10, 64)
queue.Truncate(context.Background(), idx+1)
}
}
ctx, cancel := context.WithCancel(context.Background())
// キューにメッセージを送信するゴルーチンを作成
go func() {
i := 0
for {
select {
case <-time.NewTicker(time.Microsecond * 1).C:
_, _, err := queue.Put(context.Background(), []byte(strconv.Itoa(i)), types.Tags{})
if err != nil {
fmt.Printf("Error occured, retry to handle it: %v\n", err)
}
i += 1
case <-ctx.Done():
return
}
}
}()
// キューからのメッセージを監視するウォッチャーを作成
watcher, err := queue.Watch(context.Background(), 0, 5, false, false)
if err != nil {
fmt.Printf("Failed to create a watcher to watch the queue: %v\n", err)
return
}
// キューからメッセージを読み取り、手動でコミット
for i := 0; i < 100; i++ {
df := <-watcher.FrameChan()
err := queue.Commit(context.Background(), df.Index.Uint64())
if err != nil {
fmt.Printf("Failed to commit index: %v(%v)\n", df.Index, err)
}
}
// すべて完了したら、ウォッチャーを閉じる
watcher.Close()
cancel()
}トラブルシューティング
Go 用 SDK の呼び出し例外 (認証、ルーティング、接続、サーバーに関する一般的な問題を含む) の症状、原因、およびトラブルシューティング方法については、「サービス呼び出し SDK」の「呼び出し例外のトラブルシューティング」セクションをご参照ください。
サービスステータスコード、エラーメッセージ、および推奨アクションの完全なリストについては、「付録:サービスステータスコードと一般的なエラー」をご参照ください。