公式のElastic Algorithm Service (EAS) SDKは、モデルに基づいてデプロイされたコールサービスに提供されます。 EAS SDKは、コールロジックの定義に必要な時間を短縮し、コールの安定性を向上させます。 このトピックでは、Go用EAS SDKについて説明します。 Go to callサービスのEAS SDKの使用方法を示すデモが提供されています。 これらのデモでは、入力と出力は一般的に使用されるタイプです。
背景情報
事前にGo用のEAS SDKをインストールする必要はありません。 SDKは、コードのコンパイル中にGO言語のパッケージマネージャによってGitHubから自動的にダウンロードされます。 呼び出しロジックの特定の部分をカスタマイズするには、EAS SDK for Goをダウンロードしてコードを変更します。 SDKをダウンロードするには、eas-golang-sdkにアクセスしてください。
変更方法
クラス | 移動方法 | 説明 |
PredictClient |
|
|
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
| 説明: クライアントオブジェクトを初期化します。 パラメーターの設定に使用される前述のメソッドのいずれかが呼び出された場合、 | |
|
| |
|
| |
|
| |
|
| |
TFRequest |
|
|
|
| |
|
| |
TFResponse |
|
|
|
| |
TorchRequest |
| 説明: TFRequestクラスのオブジェクトを作成します。 |
|
| |
|
| |
TorchResponse |
|
|
|
| |
QueueClient |
|
|
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
types. ウォッチャー |
|
|
| 説明: バックエンド接続を閉じるためにウォッチャーを停止します。 説明 1つのクライアントに対して起動できるウォッチャーは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を使用してモデルをサービスとして展開する場合は、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に接続されている必要があります。 詳細については、「専用リソースグループの操作」および「ネットワーク接続の設定」をご参照ください。 通常モードと比較して、このモードには
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" ) func main() { client := eas.NewPredictClient("pai-eas-vpc.cn-shanghai.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, }) }
キューイングサービスを使用したデータの送信とサブスクライブ
キュー内のデータを送信および照会したり、キューの状態を照会したり、キューによってプッシュされたデータをサブスクライブしたりできます。 次のデモでは、スレッドがキューにデータをプッシュし、別のスレッドがウォッチャーを使用してプッシュされたデータをサブスクライブします。 詳細については、次のデモを参照してください。
const ( QueueEndpoint = "182848887922****.cn-shanghai.pai-eas.aliyuncs.com" QueueName = "test_group.qservice" QueueToken = "YmE3NDkyMzdiMzNmMGM3ZmE4ZmNjZDk0M2NiMDA3OTZmNzc1MTUx****" ) queue, err := NewQueueClient(QueueEndpoint, QueueName, QueueToken) // truncate all messages in the queue 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()) // create a goroutine to send messages to the queue 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 } } }() // create a watcher to watch the messages from the queue 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 } // read messages from the queue and commit manually 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) } } // everything is done, close the watcher watcher.Close() cancel()