すべてのプロダクト
Search
ドキュメントセンター

Platform For AI:SDK for Go

最終更新日:Aug 13, 2024

公式の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

NewPredictClient(endpoint string, serviceName string) *PredictClient

  • PredictClientクラスのクライアントオブジェクトを作成します。

  • パラメーター:

    • endpoint: 必須です。 サーバーのエンドポイント。 通常モードでサービスを呼び出すには、このパラメーターをデフォルトゲートウェイのエンドポイントに設定します。

    • serviceName: 必須です。 呼び出されるサービスの名前。

  • 戻り値: 作成されたクライアントオブジェクト。

SetEndpoint(endpointName文字列)

  • 説明: サーバーのエンドポイントを指定します。

  • パラメーター: endpointName: サーバーのエンドポイント。 通常モードでサービスを呼び出すには、このパラメーターをデフォルトゲートウェイのエンドポイントに設定します。

SetServiceName(serviceName文字列)

  • 説明: サービスの名前を指定します。

  • パラメーター: serviceName: サービスの名前。

SetEndpointType(endpointType文字列)

  • 説明: サーバーのゲートウェイタイプを指定します。

  • パラメーター: endpointType: 使用するゲートウェイタイプ。 次のゲートウェイタイプがサポートされています。

    • "DEFAULT": デフォルトゲートウェイ。 ゲートウェイタイプを指定しない場合、デフォルトのゲートウェイが使用されます。

    • "DIRECT": 仮想プライベートクラウド (VPC) 直接接続チャネル。

SetToken(token string)

  • 説明: サービスアクセストークンを指定します。

  • パラメーター: token: サービスの認証に使用されるトークン。

SetHttpTransport(transport * http.Transport)

  • 説明: HTTPクライアントのトランスポート属性を設定します。

  • パラメーター: transport: HTTPリクエストの送信に使用されるトランスポートオブジェクト。

SetRetryCount(max_retry_count int)

  • 説明: リクエストの失敗後に許可される再試行の最大数を指定します。

  • パラメーター: max_retry_count: リクエストの失敗後に許可される再試行の最大数。 既定値:5

    重要

    サーバーでプロセスエラーが発生した場合、サーバーエラーが発生した場合、またはゲートウェイへの永続的な接続が閉じられた場合、クライアントは要求を再送信する必要があります。 したがって、このパラメーターを0に設定しないことを推奨します。

SetTimeout(timeout int)

  • リクエストのタイムアウト期間を設定します。

  • パラメーター: timeout: リクエストのタイムアウト期間。 単位:ミリ秒。 デフォルト値: 5000。

Init()

説明: クライアントオブジェクトを初期化します。 パラメーターの設定に使用される前述のメソッドのいずれかが呼び出された場合、Init() メソッドを呼び出すまでパラメーターは有効になりません。

Predict (リクエストリクエスト) レスポンス

  • 説明: 予測要求をオンライン予測サービスに送信します。

  • パラメータ: リクエスト: 送信されるリクエスト。 文字列、TFRequestオブジェクト、またはTorchRequestオブジェクトにすることができます。

  • 戻り値: 予測要求に対する応答。 文字列、TFResponseオブジェクト、またはTorchResponseリクエストを使用できます。

StringPredict (リクエスト文字列) 文字列

  • 説明: 予測要求をオンライン予測サービスに送信します。

  • パラメーター: request: 送信するリクエスト文字列。

  • 戻り値: 予測要求に対する応答で、文字列として返されます。

TorchPredict (リクエストTorchRequest) TorchResponse

  • 説明: PyTorch予測リクエストをオンライン予測サービスに送信します。

  • パラメーター: request: 送信するリクエスト。TorchRequestオブジェクトです。

  • 戻り値: 予測要求に対する応答。 TorchResponseオブジェクトです。

TFPredict (リクエストTFRequest) TFResponse

  • 説明: 予測要求をオンライン予測サービスに送信します。

  • パラメーター: request: 送信するリクエスト。TFRequestオブジェクトです。

  • 戻り値: 予測要求に対する応答。 TFResponseオブジェクトです。

TFRequest

TFRequest(signatureName文字列)

  • 説明: TFRequestクラスのオブジェクトを作成します。

  • パラメーター: signatureName: 呼び出されるサービスのモデルの署名名。

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

  • 説明: 呼び出すオンライン予測サービスのTensorFlowモデルの入力テンソルを指定します。

  • パラメーター:

    • inputName: 入力テンソルのエイリアス。

    • shape: 入力テンソルの形状。

    • content: 入力テンソルのデータ。 値を1次元配列の形式で指定します。 データ型は、INT32、INT64、FLOAT32、FLOAT64、STRING、またはBOOLです。 このメソッドの名前は、使用される特定のデータ型によって決まります。 例: AddFeedInt32() 他のデータ型を使用する場合は、指定されたコードに基づいてプロトコルバッファ (PB) 形式で作成します。

AddFetch(outputName文字列)

  • 説明: TensorFlowモデルからエクスポートする出力テンソルのエイリアスを指定します。

  • パラメーター: outputName: エクスポートする出力テンソルのエイリアス。

    TensorFlowモデルがSavedModel形式の場合、このパラメーターはオプションです。 このパラメーターを指定しない場合、すべての出力テンソルがエクスポートされます。

    TensorFlowモデルが凍結モデルの場合、このパラメーターは必須です。

TFResponse

GetTensorShape(outputName文字列) []int64

  • 説明: 指定したエイリアスで識別される出力テンソルの形状を照会します。

  • パラメーター: outputName: 形状を照会する出力テンソルのエイリアス。

  • 戻り値: 出力テンソルの形状。 各ディメンションは配列として表示されます。

Get(?)Val(outputName文字列) [](?)

  • 説明: 指定された出力テンソルのデータを照会します。 戻り値は1次元配列です。 このメソッドをGetTensorShape() メソッドと一緒に呼び出して、出力テンソルの形状を照会できます。 戻り値は多次元配列です。 データ型は、FLOAT、DOUBLE、INT、INT64、STRING、またはBOOLです。 このメソッドの名前は、使用される特定のデータ型によって決まります。 例: GetFloatVal()

  • パラメーター: outputName: データを照会する出力テンソルのエイリアス。

  • 戻り値: 取得した出力テンソルデータから変換された1次元配列。

TorchRequest

TorchRequest()

説明: TFRequestクラスのオブジェクトを作成します。

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

  • 説明: 呼び出すオンライン予測サービスのPyTorchモデルの入力テンソルを指定します。

  • パラメーター:

    • index: 入力テンソルのインデックス。

    • shape: 入力テンソルの形状。

    • content: 入力テンソルのデータ。 値を1次元配列の形式で指定します。 データ型は、INT32、INT64、FLOAT32、またはFLOAT64です。 このメソッドの名前は、使用される特定のデータ型によって決まります。 例: AddFeedInt32() 他のデータ型を使用する場合は、指定されたコードに基づいてプロトコルバッファ (PB) 形式で作成します。

AddFetch(outputIndex int)

  • 説明: PyTorchモデルからエクスポートする出力テンソルのインデックスを指定します。 このメソッドはオプションです。 このメソッドを呼び出して出力テンソルのインデックスを設定しない場合、すべての出力テンソルがエクスポートされます。

  • パラメーター: outputIndex: エクスポートする出力テンソルのインデックス。

TorchResponse

GetTensorShape(outputIndex int) []int64

  • 説明: 指定されたインデックスで識別される出力テンソルの形状を照会します。

  • パラメーター: outputName: 形状を照会する出力テンソルのエイリアス。

  • 戻り値: 出力テンソルの形状。 各ディメンションは配列として表示されます。

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

  • 説明: 指定された出力テンソルのデータを照会します。 戻り値は1次元配列です。 このメソッドをGetTensorShape() メソッドと一緒に呼び出して、出力テンソルの形状を取得できます。 戻り値は多次元配列です。 データ型は、FLOAT、DOUBLE、INT、またはINT64です。 このメソッドの名前は、使用される特定のデータ型によって決まります。 例: GetFloatVal()

  • パラメーター: outputName: データを照会する出力テンソルのインデックス。

  • 戻り値: 取得した出力テンソルデータから変換された1次元配列。

QueueClient

NewQueueClient (エンドポイント、queueName、トークン文字列) (* QueueClient、エラー)

  • 説明: QueueClientクラスのクライアントオブジェクトを作成します。

  • パラメーター:

    • endpoint: サーバーのエンドポイント。

    • queueName: 作成するキューの名前。

    • token: 作成するキューのトークン。

  • 戻り値: 作成されたクライアントオブジェクト。

切り捨て (ctx context.Context, index uint64) エラー

  • 説明: 特定のインデックス値の前のデータを切り捨て、インデックス値の後のデータのみを保持します。

  • パラメーター:

    • ctx: この操作のコンテキスト。

    • index: データの切り捨てに使用されるインデックス値。

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

  • 説明: データレコードをキューに書き込みます。

  • パラメーター:

    • ctx: この操作のコンテキスト。

    • data: キューに書き込むデータレコード。

  • 戻り値:

    • index: 書き込まれたデータレコードのインデックス値。 この値は、キュー内のデータを照会するために使用できます。

    • requestId: キューに書き込まれたデータレコードに対して自動的に生成されたリクエストID。 requestIdは、キュー内のデータを照会するための特別なタグとして使用できます。

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

  • 説明: レコードのインデックス値に基づいてキューからデータレコードを照会し、そのレコードを削除します。

  • パラメーター:

    • ctx: この操作のコンテキスト。

    • index: クエリするデータレコードのインデックス値。

  • 戻り値: dfs: 取得したDataFrame形式のデータレコード。

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

  • 説明: レコードのリクエストIDに基づいてキューからデータレコードを照会し、レコードを削除します。

  • パラメーター:

    • ctx: この操作のコンテキスト。

    • requestId: クエリするデータレコードのリクエストID。

  • 戻り値: 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: この操作のコンテキスト。

    • index: クエリの開始インデックス。

    • length: クエリするデータレコードの数。 このパラメーターを指定すると、indexから始まるデータレコードの最大数が返されます。 インデックス値に一致するデータレコードも返されます。

    • timeout: クエリのタイムアウト期間。 タイムアウト期間中、キューにデータが含まれている場合、指定された条件を満たすデータレコードの数が返されます。 それ以外の場合、クエリはタイムアウト期間が終了した後に停止します。

    • auto_delete: 取得したデータレコードをキューから自動的に削除するかどうかを指定します。 auto_deleteをFalseに設定すると、データレコードを繰り返し照会できます。 この場合、Del() メソッドを使用してデータを手動で削除できます。

    • tags: データレコードのクエリに使用されるタグ。 タグのキーと値は両方ともSTRING型である必要があります。 このパラメーターを指定すると、指定されたタグが追加されたインデックスから始まるデータレコードが返されます。

  • 戻り値: dfs: 取得したDataFrame形式のデータレコード。

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

  • 説明: 指定したインデックス値に一致するデータレコードをキューから削除します。

  • パラメーター:

    • ctx: この操作のコンテキスト。

    • indexes: データレコードの削除に使用される指定されたインデックス値。

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

  • 説明: キューの属性を照会します。 属性には、キュー内のデータレコードの総数と、現在のキュー内のデータレコードの数が含まれます。

  • 戻り値: attrs: キューの属性。 属性のキーと値は両方ともSTRING型である必要があります。

ウォッチ (ctx context.Context, index, window uint64, indexOnly bool, autocomit bool) (watcher types.Watcher, err error)

  • 説明: キュー内のデータレコードにサブスクライブします。 次に、キューイングサービスは指定された条件に基づいてクライアントにデータをプッシュします。

  • パラメーター:

    • ctx: この操作のコンテキスト。

    • index: サブスクライブされているデータレコードの開始インデックス。

    • window: キューイングサービスによって1つのクライアントにプッシュできるデータレコードの最大数。

      説明

      データがコミットされていない場合、サーバーは他のデータレコードをクライアントにプッシュしません。 次に、N個のデータレコードがコミットされると、N個のデータレコードがサーバにプッシュされる。 これにより、クライアントが処理するデータレコードの数がwindowに指定された値を超えないようにします。 このようにして、クライアント側の同時計算が制御される。

    • index_only: インデックス値のみをプッシュするかどうかを指定します。

    • auto_commit: レコードのプッシュ後にデータレコードを自動的にコミットするかどうかを指定します。 auto_commitをFalseに設定することを推奨します。 この場合、レコードを受信して計算した後に、データレコードを手動でコミットする必要があります。 計算が完了する前にインスタンスで例外が発生した場合、コミットされていないデータレコードはキューサービスによって他のインスタンスにプッシュされます。

  • 戻り値: プッシュされたデータを読み取るために使用されるウォッチャー。

コミット (ctx context.Context, indexes. .. uint64) エラー

  • 説明: 指定したデータレコードをコミットします。

    説明

    データレコードが処理され、他のインスタンスにプッシュする必要がない場合は、コミットされます。 次に、データレコードをキューから削除することができる。

  • パラメーター:

    • ctx: この操作のコンテキスト。

    • indexes: コミットされたデータレコードと一致する指定されたインデックス値。

types. ウォッチャー

FrameChan() <-chan types.DataFrame

  • 説明: サーバーからプッシュされたデータを含むパイプラインを返します。 パイプラインは、データを繰り返し読み取るために使用できます。

  • 戻り値: プッシュされたデータを読み取るために使用できるパイプライン。

閉じる ()

説明: バックエンド接続を閉じるためにウォッチャーを停止します。

説明

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()