日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

Golang SDK使用說明

推薦使用EAS提供的官方SDK進行服務調用,從而有效減少編寫調用邏輯的時間并提高調用穩定性。本文介紹官方Golang SDK接口詳情,并以常見類型的輸入輸出為例,提供了使用Golang SDK進行服務調用的完整程序示例。

背景信息

使用Golang SDK進行服務調用時,由于在編譯代碼時,Golang的包管理工具會自動從Github上將Golang SDK的代碼下載到本地,因此您無需提前安裝Golang SDK。如果您需要自定義部分調用邏輯,可以先下載Golang SDK代碼,再對其進行修改。

接口列表

接口

描述

PredictClient

NewPredictClient(endpoint string, serviceName string) *PredictClient

  • 功能:PredictClient類構造函數。

  • 參數:

    • endpoint:必填,表示服務端的Endpoint地址。對于普通服務,將其設置為默認網關Endpoint。

    • serviceName:必填,表示服務名稱。

  • 返回值:創建的PredictClient對象。

SetEndpoint(endpointName string)

  • 功能:設置服務的Endpoint。

  • 參數:endpointName 表示服務端的Endpoint地址。對于普通服務,將其設置為默認網關Endpoint。

SetServiceName(serviceName string)

  • 功能:設置請求的服務名稱。

  • 參數:serviceName表示請求的服務名稱。

SetEndpointType(endpointType string)

  • 功能:設置服務端的網關類型。

  • 參數:endpointType表示網關類型。系統支持以下網關類型:

    • "DEFAULT":默認網關。如果不指定網關類型,默認為該類型。

    • "DIRECT":使用高速直連通道訪問服務。

SetToken(token string)

  • 功能:設置服務訪問的Token。

  • 參數:token表示訪問服務時使用的鑒權Token。

SetHttpTransport(transport *http.Transport)

  • 功能:設置HTTP客戶端的Transport屬性。

  • 參數:transport表示發送HTTP請求時使用的Transport對象。

SetRetryCount(max_retry_count int)

  • 功能:設置請求失敗重試次數。

  • 參數:max_retry_count表示請求失敗后重連的次數,默認為5。

    重要

    對于服務端進程異常、服務器異?;蚓W關長連接斷開等情況導致的個別請求失敗,均需要客戶端重新發送請求。因此,請勿將該參數設置為0。

SetTimeout(timeout int)

  • 功能:設置請求的超時時間。

  • 參數:timeout表示請求的超時時間,單位為ms,默認值為5000。

Init()

PredictClient對象進行初始化。在上述設置參數的接口執行完成后,需要調用Init()接口才能生效。

Predict(request Request) Response

  • 功能:向在線預測服務提交一個預測請求。

  • 參數:Request對象是interface(StringRequest, TFRequest,TorchRequest)

  • 返回值:Response對象是interface(StringResponse, TFResponse,TorchResponse)。

StringPredict(request string) string

  • 功能:向在線預測服務提交一個預測請求。

  • 參數:request對象表示待發送的請求字符串。

  • 返回值:STRING類型的服務響應。

TorchPredict(request TorchRequest) TorchResponse

  • 功能:向在線預測服務提交一個PyTorch預測請求。

  • 參數:request表示TorchRequest類的對象。

  • 返回值:對應的TorchResponse。

TFPredict(request TFRequest) TFResponse

  • 功能:向在線預測服務提交一個預測請求。

  • 參數:request表示TFRequest類的對象。

  • 返回值:對應的TFResponse。

TFRequest

TFRequest(signatureName string)

  • 功能:TFRequest類的構建函數。

  • 參數:signatureName表示請求模型的Signature Name。

AddFeed(?)(inputName string, shape []int64{}, content []?)

  • 功能:請求TensorFlow的在線預測服務模型時,設置需要輸入的Tensor。

  • 參數:

    • inputName:表示輸入Tensor的別名。

    • shape:表示輸入TensorTensorShape。

    • content:表示輸入的Tensor的內容,通過一維數組展開表示。支持的類型包括INT32、INT64、FLOAT32、FLOAT64、STRINGBOOL,該接口名稱與具體類型相關,例如AddFeedInt32()。如果需要其它數據類型,則可以參考代碼自行通過PB格式構造。

AddFetch(outputName string)

  • 功能:請求TensorFlow的在線預測服務模型時,設置需要輸出Tensor的別名。

  • 參數:outputName表示待獲取的輸出Tensor的別名。

    對于SavedModel模型,該參數可選。如果未設置,則輸出所有的outputs。

    對于Frozen Model,該參數必選。

TFResponse

GetTensorShape(outputName string) []int64

  • 功能:獲得指定別名。的輸出TensorTensorShape。

  • 參數:outputName表示待獲取輸出ShapeTensor別名。

  • 返回值:返回的Tensor Shape,各個維度以數組形式表示。

Get(?)Val(outputName string) [](?)

  • 功能:獲取輸出Tensor的數據向量,輸出結果以一維數組的形式保存。您可以配套使用GetTensorShape()接口,獲取對應TensorShape,將其還原成所需的多維Tensor。支持的類型包括FLOAT、DOUBLE、INT、INT64、STRINGBOOL,接口名稱與具體類型相關,例如GetFloatVal()。

  • 參數:outputName表示待獲取輸出數據的Tensor別名。

  • 返回值:輸出Tensor的數據展開成的一維數組。

TorchRequest

TorchRequest()

TFRequest類的構建函數。

AddFeed(?)(index int, shape []int64{}, content []?)

  • 功能:請求PyTorch的在線預測服務模型時,設置需要輸入的Tensor。

  • 參數:

    • index:表示待輸入的Tensor下標。

    • shape:表示輸入TensorTensorShape。

    • content:表示輸入Tensor的內容,通過一維數組展開表示。支持的類型包括INT32、INT64、FLOAT32FLOAT64,該接口名稱與具體類型相關,例如AddFeedInt32()。如果需要其它數據類型,則可以參考代碼自行通過PB格式構造。

AddFetch(outputIndex int)

  • 功能:請求PyTorch的在線預測服務模型時,設置需要輸出的TensorIndex。該接口為可選,如果您沒有調用該接口設置輸出TensorIndex,則輸出所有的outputs。

  • 參數:outputIndex表示輸出TensorIndex。

TorchResponse

GetTensorShape(outputIndex int) []int64

  • 功能:獲得指定下標的輸出TensorTensorShape。

  • 參數:outputName表示待獲取輸出ShapeTensor別名。

  • 返回值:返回的Tensor Shape,各個維度以數組形式表示。

Get(?)Val(outputIndex int) [](?)

  • 功能:獲取輸出Tensor的數據向量,輸出結果以一維數組的形式保存。您可以配套使用GetTensorShape()接口獲取對應TensorShape,將其還原成所需的多維Tensor。支持的類型包括FLOAT、DOUBLE、INTINT64,接口名稱與具體類型相關,例如GetFloatVal()

  • 參數:outputIndex表示待獲取輸出數據Tensor的下標。

  • 返回值:輸出Tensor的數據展開成的一維數組。

QueueClient

NewQueueClient(endpoint, queueName, token string) (*QueueClient, error)

  • 功能:QueueClient類構造函數。

  • 參數:

    • endpoint:表示服務端的Endpoint地址。

    • queueName:表示隊列服務名稱。

    • token:表示隊列服務的token。

  • 返回值:創建的QueueClient對象。

Truncate(ctx context.Context, index uint64) error

  • 功能:從指定index向前截斷隊列中的數據,只保留指定index之后的數據。

  • 參數:

    • ctx:表示當前操作的Context信息。

    • index:表示要截斷的隊列中數據的index。

Put(ctx context.Context, data []byte, tags types.Tags) (index uint64, requestId string, err error)

  • 功能:向隊列中寫入一條數據。

  • 參數:

    • ctx:表示當前操作的Context信息。

    • data:表示要向隊列中寫入的數據內容。

  • 返回值:

    • index:當前寫入的數據在隊列中的index值,可用于從隊列中查詢數據。

    • requestId:當前寫入數據在隊列中自動生成的requestId。requestId是一個特殊的tag,也可用于在隊列中查詢數據。

GetByIndex(ctx context.Context, index uint64) (dfs []types.DataFrame, err error)

  • 功能:根據index值從隊列中查詢一條數據,查詢完成后,在隊列中會自動刪除該數據。

  • 參數:

    • ctx:表示當前操作的Context信息。

    • index:表示要從隊列中查詢的數據所在的index值。

  • 返回值:dfs:隊列中查詢出的以DataFrame封裝的數據結果。

GetByRequestId(ctx context.Context, requestId string) (dfs []types.DataFrame, err error)

  • 功能:根據數據的requestId從隊列中查詢一條數據,查詢完成后,在隊列中會自動刪除該數據。

  • 參數:

    • ctx:表示當前操作的Context信息。

    • requestId:表示要從隊列中查詢的數據的requestId值。

  • 返回值:dfs:隊列中查詢出的以DataFrame封裝的數據結果。

Get(ctx context.Context, index uint64, length int, timeout time.Duration, autoDelete bool, tags types.Tags) (dfs []types.DataFrame, err error)

  • 功能:根據指定條件從隊列中查詢數據,GetByIndex()GetByRequestId()是對Get()函數的簡單封裝。

  • 參數:

    • ctx:表示當前操作的Context信息。

    • index:表示要查詢的數據的起始index。

    • length:表示要查詢的數據的條數。返回從index開始計算(包含index)的最大length條數據。

    • timeout:表示查詢的等待時間。在等待時間內,如果隊列中有length條數據則直接返回,否則等到最大timeout等待時間則停止。

    • auto_delete:表示是否從隊列中自動刪除已經查詢的數據。如果配置為False,則數據可被重復查詢,您可以通過調用Del()方法手動刪除數據。

    • tags:表示查詢包含指定tags的數據,類型為map[string]string。從指定index開始遍歷length條數據,返回包含指定tags的數據。

  • 返回值:dfs:隊列中查詢出的以DataFrame封裝的數據結果。

Del(ctx context.Context, indexes ...uint64)

  • 功能:從隊列中刪除指定index的數據。

  • 參數:

    • ctx:表示當前操作的Context信息。

    • indexes:表示要從隊列中刪除的數據的index列表。

Attributes() (attrs types.Attributes, err error)

  • 功能:獲取隊列的屬性信息,包含隊列總長度、當前的數據長度等信息。

  • 返回值:attrs:隊列的屬性信息,類型為map[string]string。

Watch(ctx context.Context, index, window uint64, indexOnly bool, autocommit bool) (watcher types.Watcher, err error)

  • 功能:訂閱隊列中的數據,隊列服務會根據條件向客戶端推送數據。

  • 參數:

    • ctx:表示當前操作的Context信息。

    • index:表示訂閱的起始數據index。

    • window:表示訂閱的窗口大小,隊列服務一次最多向單個客戶端實例推送的數據量。

      說明

      如果推送的數據沒有被commit,則服務端不會再推送新數據;如果commit N條數據,則服務隊列會向客戶端推送N條數據,確??蛻舳嗽谕粫r刻處理的數據不會超過設置的窗口大小,來實現客戶端限制并發的功能。

    • index_only:表示是否只推送index值。

    • auto_commit:表示是否在推送完一條數據后,自動commit數據。建議配置為False。在收到推送數據并計算完成后手動Commit,在未完成計算的情況下實例發生異常,則實例上未commit的數據會由隊列服務分發給其他實例繼續處理。

  • 返回值:返回一個watcher對象,可通過該對象讀取推送的數據。

Commit(ctx context.Context, indexes ...uint64) error

  • 功能:commit指定index的數據。

    說明

    commit表示服務隊列推送的數據已經處理完成,可以將該數據從隊列中清除,且不需要再推送給其他實例。

  • 參數:

    • ctx:表示當前操作的Context信息。

    • indexes:表示要向隊列中commit的數據的index值列表。

types.Watcher

FrameChan() <-chan types.DataFrame

  • 功能:返回一個管道對象,服務端推送過來的數據會被寫入該管道中,可以從該管道中循環讀取數據。

  • 返回值:可用于讀取推送數據的管道對象。

Close()

功能:關閉一個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的用戶,需要將TFRequestTFResponse分別作為輸入和輸出數據格式,具體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的用戶,需要將TorchRequestTorchResponse分別作為輸入和輸出數據格式,具體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()