Ich werde Ihnen zeigen, wie Sie Ihre Produktionsumgebung authentifizieren CloudML Online-Vorhersage zu verwenden. Die CloudML-Schnellstarts verwenden gcloud
, um den Endbenutzer über Benutzernamen, Passwort usw. zu authentifizieren. gcloud
skaliert nicht gut in Umgebungen mit 100-er Maschinenstart und -stopp. Im Folgenden führen wir Sie durch die Schritte zum Erstellen eines Cloud-Dienstkontos und zum Generieren eines privaten Schlüssels , mit dem sich Ihre Produktionsinstanzen bei den Google-Servern identifizieren können. Siehe Authentifizierungsdokumentation here.
Hier ist ein Rezept, das Sie verwenden können.
PROJECT=
MODEL_NAME=
SERVICE_ACCOUNT_PREFIX=cloud-ml-predict
SERVICE_ACCOUNT="${SERVICE_ACCOUNT_PREFIX}@${PROJECT}.iam.gserviceaccount.com"
Diese Schritte müssen nur einmal ausgeführt werden und erstellen ein Dienstkonto und einen privaten Schlüssel für Sie.
# 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
Nachdem wir nun einen privaten Schlüssel (in private_key.json
) haben wir die Vorhersage API von jedem Rechner aus aufrufen, die die googleapiclient
Python-Bibliothek hat. Jetzt von jedem Rechner mit oder ohne gcloud
Sie müssen nur die folgenden Zeilen enthalten, um die Vorhersage CloudML Zugriff Service über HTTP
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)
Schließlich ist hier ein ausgearbeitetes Beispiel vorausgesetzt, Sie haben einen der MNIST Modell aus der quickstarts eingesetzt.
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
Und aus dem mnist/deployable
Ordner des Cloud ML samples wir unseren Code nennen ...
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]}]}
Voila! Wir haben einen privaten Schlüssel verwendet und nie gcloud zur Authentifizierung oder Abfrage unseres Vorhersagemodells benötigt!
Wie wählen Sie die das Dienstkonto Projekt wird mit in dem Schritt zugeordnet werden 'gcloud iam Service-Konten erstellen $ {SERVICE_ACCOUNT_PREFIX} \ --display-name $ {SERVICE_ACCOUNT_PREFIX}' – Andrew
Andrew, ich glaube nicht, es ist wichtig. Das Projekt, dem das Modell gehört, wird weiterhin in Rechnung gestellt und muss weiterhin den Zugriff auf das Dienstkonto zulassen (unabhängig davon, welches Projekt es besitzt). Das Projekt, dem das Dienstkonto gehört, behält lediglich die Möglichkeit, das Dienstkonto zu löschen. – JoshGC