【问题标题】:Using CloudML prediction API in production without gcloud在没有 gcloud 的情况下在生产中使用 CloudML 预测 API
【发布时间】:2016-12-01 18:16:26
【问题描述】:

在生产服务中使用 CloudML 预测 API 的最佳方式是什么?

我见过: https://cloud.google.com/ml/docs/quickstarts/prediction 但它依赖于 gcloud 工具

我正在寻找不依赖于在发出请求的机器上安装和初始化 gcloud 的解决方案。如果有适用于 GCP、AWS 和可能的其他云的解决方案,那就太好了。

谢谢

【问题讨论】:

    标签: google-cloud-ml


    【解决方案1】:

    我将向您展示如何验证您的生产环境以使用 CloudML 在线预测。 CloudML 快速入门使用 gcloud 通过用户名、密码等对最终用户进行身份验证。gcloud 不能很好地扩展到具有 100 台机器启动和停止的环境。下面,我将引导您完成创建云服务帐户和生成私钥的步骤,以便您的生产实例向 Google 服务器标识自己。请参阅身份验证文档here

    这是你可以使用的食谱。

    PROJECT=
    MODEL_NAME=
    SERVICE_ACCOUNT_PREFIX=cloud-ml-predict
    SERVICE_ACCOUNT="${SERVICE_ACCOUNT_PREFIX}@${PROJECT}.iam.gserviceaccount.com"
    

    这些步骤只需执行一次,就会为您创建一个服务帐户和私钥。

    # Make a new service account
    gcloud iam service-accounts create  ${SERVICE_ACCOUNT_PREFIX} \
      --display-name ${SERVICE_ACCOUNT_PREFIX}
    
    # Provide correct role to service account permissions:
    gcloud projects add-iam-policy-binding $PROJECT \
      --member "serviceAccount:$SERVICE_ACCOUNT" --role roles/viewer
    
    # Create private key for the service account:
    gcloud iam service-accounts keys create --iam-account \
      $SERVICE_ACCOUNT private_key.json
    

    现在我们有了一个私钥(在private_key.json 中),我们可以从任何具有googleapiclient Python 库的机器上调用预测API。现在从任何有或没有gcloud 的机器上,您只需要包含以下几行即可通过 HTTP 访问 CloudML 预测服务

    scopes = ['https://www.googleapis.com/auth/cloud-platform']
    credentials = ServiceAccountCredentials.from_json_keyfile_name(key_filename, scopes=scopes)
    ml_service = discovery.build('ml', 'v1beta1', credentials=credentials)
    

    最后,这是一个工作示例,假设您有一个从 quickstarts 部署的 MNIST 模型。

    cat > key_pair_cloud_ml_serve.py <<EOD
    from googleapiclient import discovery
    import json
    from oauth2client.service_account import ServiceAccountCredentials
    import sys
    
    def get_mnist_prediction(ml_service, project, model_name, instance):
      parent = 'projects/{}/models/{}'.format(project, model_name)
      request_dict = {'instances': [json.loads(instance)]}
    
      request = ml_service.projects().predict(name=parent, body=request_dict)
      print request.execute()  # waits till request is returned
    
    if __name__ == '__main__':
      usage_str = 'usage: python prog private_key.json MODEL_NAME data/predict*json'
      assert len(sys.argv) == 4, usage_str
    
      key_file = sys.argv[1]
      model_name = sys.argv[2]
      data_file = sys.argv[3]
    
      scopes = ['https://www.googleapis.com/auth/cloud-platform']
      credentials = ServiceAccountCredentials.from_json_keyfile_name(key_file,
    scopes=scopes)
      ml_service = discovery.build('ml', 'v1beta1', credentials=credentials)
      with open(key_file) as ff:
        project = json.load(ff)['project_id']
    
    
      with open(data_file) as ff:
        for ii, instance in enumerate(ff):
          get_mnist_prediction(ml_service, project, model_name, instance)
    EOD
    

    Cloud ML samplesmnist/deployable 文件夹中,我们调用我们的代码...

    python key_pair_cloud_ml_serve.py private_key.json \
      $MODEL_NAME data/predict_sample.tensor.json
    
    
    {u'predictions': [{u'prediction': 5, u'key': 0, u'scores': [0.04025577753782272, 0.00042669562390074134, 0.005919951014220715, 0.4221051335334778, 2.2986243493505754e-05, 0.5084351897239685, 0.0007824163185432553, 0.01125132292509079, 0.008616944774985313, 0.0021835025399923325]}]}
    

    瞧!我们使用了私钥,而无需使用 gcloud 进行身份验证或查询我们的预测模型!

    【讨论】:

    • 步骤gcloud iam service-accounts create ${SERVICE_ACCOUNT_PREFIX} \ --display-name ${SERVICE_ACCOUNT_PREFIX}中如何选择服务账号要关联的项目
    • 安德鲁,我认为这不重要。拥有该模型的项目仍将被计费,并且仍然必须允许服务帐户访问(无论哪个项目拥有它)。拥有服务帐户的项目仅保留删除服务帐户的能力。
    【解决方案2】:
    猜你喜欢
    • 1970-01-01
    • 2016-06-28
    • 1970-01-01
    • 2019-09-08
    • 1970-01-01
    • 2015-01-22
    • 1970-01-01
    • 2015-06-20
    • 1970-01-01
    相关资源
    最近更新 更多