通过 Python 实现 Google 云机器学习引擎的在线预测
Implement online predictions of Google Cloud Machine Learning Engine by Python
我想从 App Engine 向 ML Engine 的模型发送请求。
我在本地机器上构建了用于测试的示例代码。但是,我收到错误 'UNAUTHENTICATED':
WARNING:root:No ssl package found. urlfetch will not be able to validate SSL certificates.
91bnQuY34Oh8cJyF=....
{
"error": {
"code": 401,
"message": "Request had invalid authentication credentials. Expected OAuth 2 access token, login cookie or other valid authentication credential. See https://developers.google.com/identity/sign-in/web/devconsole-project.",
"status": "UNAUTHENTICATED"
}
}
我的示例代码:
from google.appengine.api import urlfetch
import urllib
import time
import jwt
data_to_post = {"instances":[{"text":[185,15,14,124,370,832,112,120,...]}]}
encoded_data = urllib.urlencode(data_to_post)
model_url = 'https://ml.googleapis.com/v1/projects/myproject/models/analyizesentiment:predict'
from google.appengine.api import apiproxy_stub_map
from google.appengine.api import urlfetch_stub
apiproxy_stub_map.apiproxy = apiproxy_stub_map.APIProxyStubMap()
apiproxy_stub_map.apiproxy.RegisterStub('urlfetch', urlfetch_stub.URLFetchServiceStub())
PRIVATE_KEY_ID_FROM_JSON = '??????????????????'
PRIVATE_KEY_FROM_JSON = "-----BEGIN PRIVATE KEY-----\n??????????\n-----END PRIVATE KEY-----\n"
iat = time.time()
exp = iat + 3600
payload = {'iss': 'accountname@myprojectname.iam.gserviceaccount.com',
'sub': 'accountname@myprojectname.iam.gserviceaccount.com',
'aud': 'https://ml.googleapis.com/v1/',
'iat': iat,
'exp': exp}
additional_headers = {'kid': PRIVATE_KEY_ID_FROM_JSON,
'alg': "RS256",
"typ": "JWT",}
signed_jwt = jwt.encode(payload, PRIVATE_KEY_FROM_JSON, headers=additional_headers, algorithm='RS256')
print(signed_jwt)
result = urlfetch.fetch(model_url, encoded_data, method=urlfetch.POST, headers={'Content-type': 'application/json', 'Authorization': 'Bearer ' + signed_jwt})
print(result.content)
缺的是header和
header名称:"Authorization" 值:"Bearer $token"
其中令牌是 oauth 令牌。您可以使用
生成令牌
gcloud auth login
或者您可以下载服务帐户的令牌。有用的阅读:https://developers.google.com/api-client-library/python/guide/aaa_oauth
但是,在应用引擎上,您应该能够从标准凭据 api 获取它
您还可以修改您的示例以使用凭据 object 并以编程方式附加该 header。
from googleapiclient import discovery
from oauth2client.client import GoogleCredentials
PROJECT=''
MODEL=''
VERSION=''
credentials = GoogleCredentials.get_application_default()
api = discovery.build('ml', 'v1', credentials=credentials)
# Add your sample instances here.
request_data = {'instances':[] }
parent = 'projects/%s/models/%s/versions/%s' % (PROJECT, MODEL, VERSION)
response = api.projects().predict(body=request_data, name=parent).execute()
print "response={0}".format(response)
如果您想提供不同的超时,上面的 execute() 方法可以使用 http object。你应该能够提供额外的 headers.
我想从 App Engine 向 ML Engine 的模型发送请求。
我在本地机器上构建了用于测试的示例代码。但是,我收到错误 'UNAUTHENTICATED':
WARNING:root:No ssl package found. urlfetch will not be able to validate SSL certificates.
91bnQuY34Oh8cJyF=....
{
"error": {
"code": 401,
"message": "Request had invalid authentication credentials. Expected OAuth 2 access token, login cookie or other valid authentication credential. See https://developers.google.com/identity/sign-in/web/devconsole-project.",
"status": "UNAUTHENTICATED"
}
}
我的示例代码:
from google.appengine.api import urlfetch
import urllib
import time
import jwt
data_to_post = {"instances":[{"text":[185,15,14,124,370,832,112,120,...]}]}
encoded_data = urllib.urlencode(data_to_post)
model_url = 'https://ml.googleapis.com/v1/projects/myproject/models/analyizesentiment:predict'
from google.appengine.api import apiproxy_stub_map
from google.appengine.api import urlfetch_stub
apiproxy_stub_map.apiproxy = apiproxy_stub_map.APIProxyStubMap()
apiproxy_stub_map.apiproxy.RegisterStub('urlfetch', urlfetch_stub.URLFetchServiceStub())
PRIVATE_KEY_ID_FROM_JSON = '??????????????????'
PRIVATE_KEY_FROM_JSON = "-----BEGIN PRIVATE KEY-----\n??????????\n-----END PRIVATE KEY-----\n"
iat = time.time()
exp = iat + 3600
payload = {'iss': 'accountname@myprojectname.iam.gserviceaccount.com',
'sub': 'accountname@myprojectname.iam.gserviceaccount.com',
'aud': 'https://ml.googleapis.com/v1/',
'iat': iat,
'exp': exp}
additional_headers = {'kid': PRIVATE_KEY_ID_FROM_JSON,
'alg': "RS256",
"typ": "JWT",}
signed_jwt = jwt.encode(payload, PRIVATE_KEY_FROM_JSON, headers=additional_headers, algorithm='RS256')
print(signed_jwt)
result = urlfetch.fetch(model_url, encoded_data, method=urlfetch.POST, headers={'Content-type': 'application/json', 'Authorization': 'Bearer ' + signed_jwt})
print(result.content)
缺的是header和
header名称:"Authorization" 值:"Bearer $token"
其中令牌是 oauth 令牌。您可以使用
生成令牌gcloud auth login
或者您可以下载服务帐户的令牌。有用的阅读:https://developers.google.com/api-client-library/python/guide/aaa_oauth
但是,在应用引擎上,您应该能够从标准凭据 api 获取它
您还可以修改您的示例以使用凭据 object 并以编程方式附加该 header。
from googleapiclient import discovery
from oauth2client.client import GoogleCredentials
PROJECT=''
MODEL=''
VERSION=''
credentials = GoogleCredentials.get_application_default()
api = discovery.build('ml', 'v1', credentials=credentials)
# Add your sample instances here.
request_data = {'instances':[] }
parent = 'projects/%s/models/%s/versions/%s' % (PROJECT, MODEL, VERSION)
response = api.projects().predict(body=request_data, name=parent).execute()
print "response={0}".format(response)
如果您想提供不同的超时,上面的 execute() 方法可以使用 http object。你应该能够提供额外的 headers.