このガイドでは、Go 用の公式 SDK の API を解説し、一般的な入出力フォーマットの完全なコード例を提供します。
SDK のユースケースと呼び出しの原則については、「サービス呼び出し SDK」をご参照ください。
前提条件
Go 用 SDK を使用して推論サービスを呼び出す場合、Go パッケージマネージャーは、コンパイル時に GitHub から SDK のソースコードを自動的にダウンロードします。事前に SDK をインストールする必要はありません。呼び出しロジックをカスタマイズする必要がある場合は、Go 用 SDK のソースコードをダウンロードして、ローカルで変更できます。
SDK をインポートするには、次のコードを使用します。
import (
"github.com/pai-eas/eas-golang-sdk/eas"
)クイックスタート
モデルの入力データフォーマットに対応する Request クラスを選択します。次の例は、文字列リクエストを使用した最小限のエンドツーエンド呼び出しです。
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 リファレンス
SDK for Go は、用途別にグループ化された次のクラスを提供します。
グループ | 説明 |
メインクライアント | PredictClient:エンドポイント、サービス名、トークンなどのサービス情報を設定し、リクエストを送信してレスポンスを受信します。 |
入力と出力 |
|
キューサービス |
|
PredictClient
サービス情報の設定、リクエストの送信、予測結果の受信に使用されるメインクライアントクラスです。
メソッド | 説明 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| PredictClient オブジェクトを初期化します。前述のメソッドでパラメーターを設定した後、 |
|
|
|
|
|
|
|
|
TFRequest
TensorFlow モデルの入力データを構築します。
メソッド | 説明 |
|
|
|
|
|
|
TFResponse
TensorFlow モデルからの出力データを解析します。
メソッド | 説明 |
|
|
|
|
TorchRequest
PyTorch モデルの入力データを構築します。
メソッド | 説明 |
|
|
|
|
|
|
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 専用接続を使用すると、Elastic Algorithm Service (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 コンソールのサービス詳細ページにある [Invocation Information] タブで確認できます。
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 コンソールのサービス詳細ページにある [Invocation Information] タブで確認できます。
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 を使用すると、キューサービスへのデータ送信、データのクエリ、キューサービスのステータス確認、およびキューサービスからのデータプッシュをサブスクライブできます。この例では、一方のゴルーチンがキューサービスにデータを送信し、もう一方のゴルーチンがウォッチャーを使用してそのデータをサブスクライブし、受信します。
EAS で非同期推論サービスをデプロイすると、入力キューと出力キューが自動的に生成されます。アドレスは通常、次のフォーマットになります:
入力キュー: <domain>/api/predict/<service_name>
出力キュー: <domain>/api/predict/<service_name>/sink
要件に応じて、<service_name> または <service_name>/sink を使用して QueueClient を作成します。
const (
QueueEndpoint = "182848887922****.cn-shanghai.pai-eas.aliyuncs.com"
// 例えば、EAS サービス名が test_qservice の場合、入力キュー名は test_qservice、出力キュー名は test_qservice/sink となります。
QueueName = "test_qservice"
QueueToken = "YmE3NDkyMzdiMzNmMGM3ZmE4ZmNjZDk0M2NiMDA3OTZmNzc1MTUx****"
)
queue, err := NewQueueClient(QueueEndpoint, QueueName, QueueToken)
// キュー内のすべてのメッセージをトランケートします
attrs, err := queue.Attributes()
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()トラブルシューティング
SDK for Go を使用してサービスを呼び出す際に発生する一般的な問題のトラブルシューティング (原因とソリューションを含む) については、Service invocation SDKs の「Troubleshoot invocation exceptions」セクションをご参照ください。
サービスステータスコード、エラーメッセージ、および推奨される対応の一覧については、「Appendix: Service status codes and common errors」をご参照ください。