公式の Elastic Algorithm Service(EAS)SDK は、モデルに基づいてデプロイされたサービスを呼び出すために提供されています。 EAS SDK は、呼び出しロジックを定義するために必要な時間を短縮し、呼び出しの安定性を向上させます。このトピックでは、Go 用 EAS SDK について説明します。 デモが提供されており、Go 用 EAS SDK を使用してサービスを呼び出す方法を示しています。 これらのデモでは、入力と出力は一般的に使用される型です。
背景情報
Go 用 EAS SDK を事前にインストールする必要はありません。 SDK は、コードのコンパイル中に GO 言語の パッケージマネージャ によって GitHub から自動的にダウンロードされます。 呼び出しロジックの特定の部分をカスタマイズするには、Go 用 EAS SDK をダウンロードしてコードを変更します。 SDK をダウンロードするには、eas-golang-sdk にアクセスしてください。
メソッド
クラス | メソッド | 説明 |
PredictClient |
|
|
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
| 説明: クライアントオブジェクトを初期化します。 パラメーターを設定するために使用される上記のいずれかのメソッドが呼び出された場合、 | |
|
| |
|
| |
|
| |
|
| |
TFRequest |
|
|
|
| |
|
| |
TFResponse |
|
|
|
| |
TorchRequest |
| 説明: TFRequest クラスのオブジェクトを作成します。 |
|
| |
|
| |
TorchResponse |
|
|
|
| |
QueueClient |
|
|
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
types.Watcher |
|
|
| 説明:バックエンド接続を閉じるためにウォッチャーを停止します。 説明 1 つのクライアントに対して開始できるウォッチャーは 1 つだけです。別のウォッチャーを開始する前に、ウォッチャーを閉じる必要があります。 |
デモ
文字列としての入力と出力
カスタム プロセッサを使用してモデルをサービスとしてデプロイする場合、Predictive Model Markup Language(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 を使用してモデルをサービスとしてデプロイする場合は、サービスを呼び出すために 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 専用リソースグループにデプロイされているサービスのみにアクセスできます。 さらに、チャネルを使用するには、EAS 専用リソースグループと指定された vSwitch が VPC に接続されている必要があります。 詳細については、「EAS リソースグループの操作」および「ネットワーク接続の設定」をご参照ください。 通常モードと比較して、このモードには追加のコード行
client.SetEndpointType(eas.EndpointTypeDirect)が含まれています。 このモードは、高並列性と大量トラフィックのシナリオで使用できます。 詳細については、次のデモをご参照ください。package main // 必要なパッケージをインポートします import ( "fmt" "github.com/pai-eas/eas-golang-sdk/eas" ) func main() { client := eas.NewPredictClient("pai-eas-vpc.cn-shanghai.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() { client := eas.NewPredictClient("pai-eas-vpc.cn-shanghai.aliyuncs.com", "network_test") client.SetToken("MDAwZDQ3NjE3OThhOTI4ODFmMjJiYzE0MDk1NWRkOGI1MmVhMGI0****") client.SetEndpointType(eas.EndpointTypeDirect) // クライアントの HTTP トランスポートパラメータを設定します client.SetHttpTransport(&http.Transport{ MaxConnsPerHost: 300, TLSHandshakeTimeout: 100 * time.Millisecond, ResponseHeaderTimeout: 200 * time.Millisecond, ExpectContinueTimeout: 200 * time.Millisecond, }) }キューイング サービスを使用してデータを送受信する
キュー内のデータの送受信、キューの状態のクエリ、およびキューによってプッシュされたデータのサブスクライブを行うことができます。 次のデモでは、1 つのスレッドがキューにデータをプッシュし、別のスレッドがウォッチャーを使用してプッシュされたデータをサブスクライブします。 詳細については、次のデモをご参照ください。
説明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(): break } } }() // キューからのメッセージを監視するウォッチャーを作成します 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()