推薦使用EAS提供的官方SDK進行服務調用,從而有效減少編寫調用邏輯的時間并提高調用穩定性。本文介紹官方Golang SDK接口詳情,并以常見類型的輸入輸出為例,提供了使用Golang SDK進行服務調用的完整程序示例。
背景信息
使用Golang SDK進行服務調用時,由于在編譯代碼時,Golang的包管理工具會自動從Github上將Golang SDK的代碼下載到本地,因此您無需提前安裝Golang SDK。如果您需要自定義部分調用邏輯,可以先下載Golang SDK代碼,再對其進行修改。
接口列表
類 | 接口 | 描述 |
PredictClient |
|
|
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
| 對PredictClient對象進行初始化。在上述設置參數的接口執行完成后,需要調用 | |
|
| |
|
| |
|
| |
|
| |
TFRequest |
|
|
|
| |
|
| |
TFResponse |
|
|
|
| |
TorchRequest |
| TFRequest類的構建函數。 |
|
| |
|
| |
TorchResponse |
|
|
|
| |
QueueClient |
|
|
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
types.Watcher |
|
|
| 功能:關閉一個Watcher對象,用于關閉后端的數連接。 說明 一個客戶端只能啟動一個Watcher對象,使用完成后需要將該對象關閉才能啟動新的Watcher對象。 |
程序示例
字符串輸入輸出示例
對于使用自定義Processor部署服務的用戶而言,通常采用字符串進行服務調用(例如,PMML模型服務的調用),具體的Demo程序如下。
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分別作為輸入和輸出數據格式,具體Demo示例如下。
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分別作為輸入和輸出數據格式,具體Demo示例如下。
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網絡直連方式調用服務的示例
通過網絡直連方式,您只能訪問部署在EAS專屬資源組的服務,且需要為該資源組與用戶指定的vSwitch連通網絡后才能使用。關于如何購買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" ) 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, }) }
隊列服務發送、訂閱數據示例
通過QueueClient可向隊列服務中發送數據、查詢數據、查詢隊列服務的狀態以及訂閱隊列服務中的數據推送。以下方Demo為例,介紹一個線程向隊列服務中推送數據,另一個線程通過Watcher訂閱隊列服務中推送過來的數據。
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()