Von der Estimator API zur TPUEstimator API migrieren
In dieser Anleitung wird beschrieben, wie Sie ein Modellprogramm mit der Estimator API in ein Programm mit der TPUEstimator API umwandeln. Hinweis: Einige der in diesem Dokument verlinkten Inhalte sind nur auf Englisch verfügbar.
Warnung: Die TPUEstimator API wird nur mit Tensorflow 1.x unterstützt. Wenn Sie Ihr Modell mit Tensorflow 2.x schreiben, verwenden Sie stattdessen Keras.
Überblick
Modellprogramme, die die TPUEstimator API verwenden, können die Tensor Processing Units (TPUs) voll ausnutzen, bleiben jedoch mit CPUs und GPUs kompatibel.
Nachdem Sie diese Anleitung beendet haben, wissen Sie:
- wie Sie Ihren Code von der Verwendung der Estimator API in die TPUEstimator API konvertieren.
- Wie Sie Vorhersagen auf Cloud TPU ausführen
Hinweis
Bevor Sie mit dieser Anleitung beginnen, prüfen Sie, ob Ihr Google Cloud-Projekt ordnungsgemäß eingerichtet ist.
In dieser Anleitung werden kostenpflichtige Komponenten der Google Cloud verwendet. Rufen Sie die Seite mit den Cloud TPU-Preisen auf, um Ihre Kosten abzuschätzen. Denken Sie daran, nicht mehr benötigte Ressourcen zu bereinigen, um unnötige Kosten zu vermeiden.
Ressourcen einrichten
Dieser Abschnitt enthält Informationen zum Einrichten von Cloud Storage-Speicher-, VM- und Cloud TPU-Ressourcen für Anleitungen.
Cloud Storage-Bucket erstellen
Zum Speichern der Daten, die Sie zum Trainieren Ihres Modells verwenden, und zum Speichern der Trainingsergebnisse benötigen Sie einen Cloud Storage-Bucket. Der in dieser Anleitung verwendete Befehl gcloud
richtet Standardberechtigungen für das Cloud TPU-Dienstkonto ein. Wenn Sie weitere Berechtigungen benötigen, können Sie die Berechtigungen auf Zugriffsebene anpassen.
Der Bucket-Speicherort muss sich in derselben Region wie die virtuelle Maschine (VM) und der TPU-Knoten befinden. VMs und TPU-Knoten befinden sich in bestimmten Zonen, die Untergruppen innerhalb einer Region sind.
Rufen Sie in der Google Cloud Console die Seite „Cloud Storage“ auf.
Erstellen Sie durch die Angabe der folgenden Optionen einen neuen Bucket:
- Eindeutiger Name Ihrer Wahl
- Wählen Sie
Region
als Standorttyp undus-central1
als Speicherort (Zone) aus. - Standard-Speicherklasse:
Standard
- Speicherort: Geben Sie einen Bucket-Speicherort in derselben Region an, in der Sie den TPU-Knoten erstellen möchten. Welche TPU-Typen in welchen Zonen verfügbar sind, erfahren Sie unter TPU-Typen und Zonen.
TPU und VM erstellen
TPU-Ressourcen bestehen aus einer virtuellen Maschine (VM) und einer Cloud TPU, die denselben Namen haben. Diese Ressourcen müssen sich in derselben Region/Zone wie der gerade erstellte Bucket befinden.
Sie können die VM und die TPU-Ressourcen mit gcloud
-Befehlen oder über die Cloud Console einrichten. Weitere Informationen zum Verwalten von TPU-Ressourcen finden Sie unter TPUs erstellen und löschen.
Öffnen Sie ein Cloud Shell-Fenster.
Konfigurieren Sie
gcloud
so, dass es Ihr Projekt verwendet.$ gcloud config set project your-project
Projekt, in dem Sie eine Cloud TPU erstellen möchten.Starten Sie mit dem Befehl
gcloud
eine Compute Engine-VM und eine Cloud TPU.$ gcloud compute tpus execution-groups create \ --name=tpu-name \ --zone=europe-west4-a \ --tf-version=2.12.0 \ --machine-type=n1-standard-1 \ --accelerator-type=v3-8
Beschreibung der Befehls-Flags
name
- Der Name der zu erstellenden Cloud TPU.
zone
- Die Zone, in der Sie die Cloud TPU erstellen möchten.
tf-version
- Die Version von Tensorflow, die der Befehl
gcloud
auf Ihrer VM installiert. machine-type
- Der Maschinentyp der zu erstellenden Compute Engine-VM.
accelerator-type
- Der Typ der zu erstellenden Cloud TPU.
Weitere Informationen zum Befehl
gcloud
finden Sie in der gcloud-Referenz.Wenn der Befehl
gcloud compute tpus execution-groups
ausgeführt wurde, sollten Sie prüfen, ob die Shell-Eingabeaufforderung vonusername@projectname
zuusername@vm-name
geändert wurde. Diese Änderung bedeutet, dass Sie jetzt bei Ihrer Compute Engine-VM angemeldet sind.gcloud compute ssh tpu-name --zone=europe-west4-a
Führen Sie im weiteren Verlauf dieser Anleitung jeden Befehl, der mit (vm)$
beginnt, in Ihrem VM-Sitzungsfenster aus.
pandas installieren
Installieren oder aktualisieren Sie pandas mit dem folgenden Befehl:
pip install pandas
Hyperparameter definieren
In diesem Codeabschnitt fügen Sie mehrere von TPUs benötigte Hyperparameter hinzu. Sie fügen diese Hyperparameter als Flags Ihrem Trainingsskript hinzu, sodass Sie sie zur Laufzeit ändern können.
Die hinzuzufügenden Parameter sind:
- tpu. Dieser Parameter gibt den Namen oder die IP-Adresse des TPU-Knotens an, auf dem das Modell ausgeführt werden soll.
- model_dir. Der Pfad zum Speichern von Modellprüfpunkten. Dieser Pfad muss ein Cloud Storage-Bucket sein.
- iterations. Die Anzahl der Iterationen pro Trainingsschleife.
- use_tpu. Gibt an, ob Sie das Modell abhängig von der Verfügbarkeit auf TPUs oder GPU/CPUs ausführen möchten.
Estimator API
# Model specific parameters
tf.flags.DEFINE_integer("batch_size",
default=50,
help="Batch size.")
tf.flags.DEFINE_integer("train_steps",
default=1000,
help="Total number of training steps.")
FLAGS = tf.flags.FLAGS
TPUEstimator API
# Cloud TPU Cluster Resolver flags
tf.flags.DEFINE_string(
"tpu", default=None,
help="The Cloud TPU to use for training. This should be the name used when "
"creating the Cloud TPU. To find out the name of TPU, either use command "
"'gcloud compute tpus list --zone=<zone-name>', or use "
"'ctpu status --details' if you have created your Cloud TPU using 'ctpu up'.")
# Model specific parameters
tf.flags.DEFINE_string(
"model_dir", default="",
help="This should be the path of storage bucket which will be used as "
"model_directory to export the checkpoints during training.")
tf.flags.DEFINE_integer(
"batch_size", default=128,
help="This is the global batch size and not the per-shard batch.")
tf.flags.DEFINE_integer(
"train_steps", default=1000,
help="Total number of training steps.")
tf.flags.DEFINE_integer(
"eval_steps", default=4,
help="Total number of evaluation steps. If `0`, evaluation "
"after training is skipped.")
# TPU specific parameters.
tf.flags.DEFINE_bool(
"use_tpu", default=True,
help="True, if want to run the model on TPU. False, otherwise.")
tf.flags.DEFINE_integer(
"iterations", default=500,
help="Number of iterations per TPU training loop.")
Daten laden
In diesem Codeabschnitt wird angegeben, wie die Daten gelesen und geladen werden.
TPUs unterstützen die folgenden Datentypen:
tf.float32
tf.complex64
tf.int64
tf.bool
tf.bfloat64
Estimator API
def load_data(y_name='Species'):
"""Returns the iris dataset as (train_x, train_y), (test_x, test_y)."""
train_path, test_path = maybe_download()
train = pd.read_csv(train_path, names=CSV_COLUMN_NAMES, header=0)
train_x, train_y = train, train.pop(y_name)
test = pd.read_csv(test_path, names=CSV_COLUMN_NAMES, header=0)
test_x, test_y = test, test.pop(y_name)
return (train_x, train_y), (test_x, test_y)
TPUEstimator API
def load_data(y_name='Species'):
"""Returns the iris dataset as (train_x, train_y), (test_x, test_y)."""
train_path, test_path = maybe_download()
train = pd.read_csv(train_path, names=CSV_COLUMN_NAMES, header=0,
dtype={'SepalLength': pd.np.float32,
'SepalWidth': pd.np.float32,
'PetalLength': pd.np.float32,
'PetalWidth': pd.np.float32,
'Species': pd.np.int32})
train_x, train_y = train, train.pop(y_name)
test = pd.read_csv(test_path, names=CSV_COLUMN_NAMES, header=0,
dtype={'SepalLength': pd.np.float32,
'SepalWidth': pd.np.float32,
'PetalLength': pd.np.float32,
'PetalWidth': pd.np.float32,
'Species': pd.np.int32})
test_x, test_y = test, test.pop(y_name)
return (train_x, train_y), (test_x, test_y)
Eingabefunktionen definieren
Ein wesentlicher Unterschied zwischen der Estimator API und der TPUEstimator API ist die Funktionssignatur der Eingabefunktionen. Bei der Estimator API können Sie Eingabefunktionen mit einer beliebigen Anzahl von Parametern schreiben. Bei der TPUEstimator API können Eingabefunktionen nur den Parameter params
aufnehmen. params
enthält alle Schlüssel/Wert-Paare aus dem TPUEstimator-Objekt sowie zusätzliche Schlüssel wie batch_size
.
Eine Möglichkeit, mit diesem Unterschied umzugehen, ist die Verwendung von Lambda-Funktionen beim Aufrufen der Eingabefunktionen. Bei Lambda-Funktionen sind nur geringfügige Änderungen an Ihren vorhandenen Eingabefunktionen erforderlich.
In den folgenden Abschnitten wird beschrieben, wie Sie Ihre Eingabefunktionen aktualisieren. Später werden Sie sehen, wie Sie mit Lambda-Funktionen diese Eingabefunktionen konvertieren, damit sie mit der TPUEstimator API funktionieren.
Trainingseingabefunktion
Bei der TPUEstimator API muss die Trainingseingabefunktion train_input_fn
eine Anzahl von Eingabesamples zurückgeben, die nach der Anzahl der Cloud TPU-Kerne aufgeteilt werden können. Wenn Sie beispielsweise 8 Kerne verwenden, muss jede Batchgröße durch 8 teilbar sein.
Damit das funktioniert, verwendet der vorstehende Code die Funktion dataset.batch(batch_size, drop_remainder=True)
. Diese erstellt Batches gemäß dem Parameter batch_size
und verwirft den Rest.
Estimator API
def train_input_fn(features, labels, batch_size):
"""An input function for training"""
# Convert the inputs to a Dataset.
dataset = tf.data.Dataset.from_tensor_slices((dict(features), labels))
# Shuffle, repeat, and batch the examples.
dataset = dataset.shuffle(1000).repeat().batch(batch_size)
# Return the dataset.
return dataset
TPUEstimator API
def train_input_fn(features, labels, batch_size):
"""An input function for training."""
# Convert the inputs to a Dataset.
dataset = tf.data.Dataset.from_tensor_slices((dict(features), labels))
# Shuffle, repeat, and batch the examples.
dataset = dataset.shuffle(1000).repeat()
dataset = dataset.batch(batch_size, drop_remainder=True)
# Return the dataset.
return dataset
Bewertungseingabefunktion
In diesem Schritt aktualisieren Sie die Bewertungseingabefunktion eval_input_fn
, damit die Eingabesamples nach der Anzahl der TPU-Kerne aufgeteilt werden können. Verwenden Sie dazu die Funktion dataset.batch(batch_size, drop_remainder=True)
.
Estimator API
def eval_input_fn(features, labels, batch_size):
"""An input function for evaluation or prediction"""
features=dict(features)
if labels is None:
# No labels, use only features.
inputs = features
else:
inputs = (features, labels)
# Convert the inputs to a Dataset.
dataset = tf.data.Dataset.from_tensor_slices(inputs)
# Batch the examples
assert batch_size is not None, "batch_size must not be None"
dataset = dataset.batch(batch_size)
# Return the dataset.
return dataset
TPUEstimator API
def eval_input_fn(features, labels, batch_size):
"""An input function for evaluation."""
features = dict(features)
inputs = (features, labels)
# Convert the inputs to a Dataset.
dataset = tf.data.Dataset.from_tensor_slices(inputs)
dataset = dataset.shuffle(1000).repeat()
dataset = dataset.batch(batch_size, drop_remainder=True)
# Return the dataset.
return dataset
Vorhersageeingabefunktion
Für Vorhersagen in TPUEstimators muss das Eingabe-Dataset Tensoren mit der zusätzlichen äußeren Dimension von batch_size
haben. Deshalb ist es erforderlich, dass Sie eine Vorhersageeingabefunktion mit den Parametern features
und batch_size
hinzufügen. Bei dieser Funktion können Sie weniger Eingabesamples als batch_size
verwenden.
Eine Vorhersageeingabefunktion ist optional, wenn Sie die Estimator API verwenden.
Estimator API
Eine Vorhersageeingabefunktion ist für die Estimator API optional, da die Bewertungsfunktion eval_input_fn diese Aufgabe ausführt.
TPUEstimator API
def predict_input_fn(features, batch_size):
"""An input function for prediction."""
dataset = tf.data.Dataset.from_tensor_slices(features)
dataset = dataset.batch(batch_size)
return dataset
Benutzerdefinierte Modellfunktionen aktualisieren
Als Nächstes müssen Sie die benutzerdefinierte Modellfunktion aktualisieren:
- Ersetzen Sie Instanzen von
tf.estimator.EstimatorSpec
, umtf.contrib.tpu.TPUEstimatorSpec
zu verwenden. - Entfernen Sie alle Instanzen von
tf.summary
. Die TPUEstimator API unterstützt keine benutzerdefinierten Zusammenfassungen für TensorBoard. Grundlegende Zusammenfassungen werden jedoch automatisch in Ereignisdateien im Modellverzeichnis aufgezeichnet. - Verpacken Sie das Optimierungstool mit
tf.contrib.tpu.CrossShardOptimizer
. DerCrossShardOptimizer
verwendetallreduce
, um Gradienten zusammenzufassen und das Ergebnis an jeden Shard zu senden. Da derCrossShardOptimizer
nicht mit dem lokalen Training kompatibel ist, müssen Sie auch das Flaguse_tpu
prüfen.
Estimator API
def my_model(features, labels, mode, params):
"""DNN with three hidden layers, and dropout of 0.1 probability."""
# Create three fully connected layers each layer having a dropout
# probability of 0.1.
net = tf.feature_column.input_layer(features, params['feature_columns'])
for units in params['hidden_units']:
net = tf.layers.dense(net, units=units, activation=tf.nn.relu)
# Compute logits (1 per class).
logits = tf.layers.dense(net, params['n_classes'], activation=None)
# Compute predictions.
predicted_classes = tf.argmax(logits, 1)
if mode == tf.estimator.ModeKeys.PREDICT:
predictions = {
'class_ids': predicted_classes[:, tf.newaxis],
'probabilities': tf.nn.softmax(logits),
'logits': logits,
}
return tf.estimator.EstimatorSpec(mode, predictions=predictions)
# Compute loss.
loss = tf.losses.sparse_softmax_cross_entropy(labels=labels,
logits=logits)
# Compute evaluation metrics.
accuracy = tf.metrics.accuracy(labels=labels,
predictions=predicted_classes,
name='acc_op')
metrics = {'accuracy': accuracy}
tf.summary.scalar('accuracy', accuracy[1])
if mode == tf.estimator.ModeKeys.EVAL:
return tf.estimator.EstimatorSpec(
mode, loss=loss, eval_metric_ops=metrics)
# Create training op.
if mode == tf.estimator.ModeKeys.TRAIN
optimizer = tf.train.AdagradOptimizer(learning_rate=0.1)
train_op = optimizer.minimize(loss, global_step=tf.train.get_global_step())
return tf.estimator.EstimatorSpec(mode, loss=loss, train_op=train_op)
TPUEstimator API
def my_model(features, labels, mode, params):
"""Deep Neural Network(DNN) model.
This is a DNN Model with 3 hidden layers. First 2 hidden layers are having
10 neurons in each. And number of neurons in the last layer is equal to the
number of output classes. This is a densely connected network where each
neuron of previous layer is connected to each neuron of next layer.
Args:
features: Feature values for input samples.
labels: label/class assigned to the corresponding input sample.
mode: "TRAIN"/"EVAL"/"PREDICT"
params: Dictionary used to pass extra parameters to model function from
the main function.
Returns:
TPUEstimatorSpec object.
"""
# Create three fully connected layers.
net = tf.feature_column.input_layer(features, params["feature_columns"])
for units in params["hidden_units"]:
net = tf.layers.dense(net, units=units, activation=tf.nn.relu)
# Compute logits (1 per class).
logits = tf.layers.dense(net, params["n_classes"], activation=None)
# Compute predictions.
predicted_classes = tf.argmax(logits, 1)
if mode == tf.estimator.ModeKeys.PREDICT:
predictions = {
"class_ids": predicted_classes[:, tf.newaxis],
"probabilities": tf.nn.softmax(logits),
"logits": logits,
}
return tf.contrib.tpu.TPUEstimatorSpec(mode, predictions=predictions)
# Compute loss.
loss = tf.losses.sparse_softmax_cross_entropy(labels=labels,
logits=logits)
if mode == tf.estimator.ModeKeys.EVAL:
return tf.contrib.tpu.TPUEstimatorSpec(
mode=mode, loss=loss, eval_metrics=(metric_fn, [labels, logits]))
# Create training op.
if mode == tf.estimator.ModeKeys.TRAIN:
optimizer = tf.train.AdagradOptimizer(learning_rate=0.1)
if FLAGS.use_tpu:
optimizer = tf.contrib.tpu.CrossShardOptimizer(optimizer)
train_op = optimizer.minimize(loss, global_step=tf.train.get_global_step())
return tf.contrib.tpu.TPUEstimatorSpec(mode, loss=loss, train_op=train_op)
Bewertungsmesswertfunktion hinzufügen
Ein weiterer Unterschied zwischen der Estimator API und der TPUEstimator API besteht darin, wie sie mit Metriken umgehen. Mit der Estimator API können Sie Metriken als normales Wörterbuch übergeben. Für die TPUEstimator API müssen Sie stattdessen eine Funktion verwenden.
Estimator API
Optional. Die Funktion my_model
generiert die Messwerte.
TPUEstimator API
def metric_fn(labels, logits):
"""Function to return metrics for evaluation."""
predicted_classes = tf.argmax(logits, 1)
accuracy = tf.metrics.accuracy(labels=labels,
predictions=predicted_classes,
name="acc_op")
return {"accuracy": accuracy}
Hauptfunktion aktualisieren
TPUs konfigurieren
In diesem Schritt konfigurieren Sie den TPU-Cluster.
Mit den den Hyperparametern zugewiesenen Werten können Sie den Cluster konfigurieren. Weitere Informationen finden Sie unter Hyperparameter definieren. Legen Sie außerdem die folgenden Werte fest:
allow_soft_placement
: Wenn dieser Parameter auf "true" gesetzt ist, kann TensorFlow ein GPU-Gerät verwenden, wenn keine TPU verfügbar ist. Wenn ein GPU-Gerät ebenfalls nicht verfügbar ist, wird ein CPU-Gerät verwendet.log_device_placement
: Dieser Parameter gibt an, dass TensorFlow Geräteplatzierungen protokollieren soll.
Estimator API
Nicht erforderlich, da dieser Codeabschnitt nur TPUs betrifft.
TPUEstimator API
# Resolve TPU cluster and runconfig for this.
tpu_cluster_resolver = tf.contrib.cluster_resolver.TPUClusterResolver(
FLAGS.tpu)
run_config = tf.contrib.tpu.RunConfig(
model_dir=FLAGS.model_dir,
cluster=tpu_cluster_resolver,
session_config=tf.ConfigProto(
allow_soft_placement=True, log_device_placement=True),
tpu_config=tf.contrib.tpu.TPUConfig(FLAGS.iterations),
)
Dem Klassifizierer TPU-spezifische Parameter hinzufügen
In diesem Abschnitt des Codes aktualisieren Sie die Klassifizierervariable für die Verwendung der TPUEstimator-Klasse. Fügen Sie für diese Änderungen die folgenden Parameter hinzu:
use_tpu
train_batch_size
eval_batch_size
predict_batch_size
config
Estimator API
# Build 2 hidden layer DNN with 10, 10 units respectively.
classifier = tf.estimator.Estimator(
model_fn=my_model,
params={
'feature_columns': my_feature_columns,
# Two hidden layers of 10 nodes each.
'hidden_units': [10, 10],
# The model must choose between 3 classes.
'n_classes': 3,
})
TPUEstimator API
# Build 2 hidden layer DNN with 10, 10 units respectively.
classifier = tf.contrib.tpu.TPUEstimator(
model_fn=my_model,
use_tpu=FLAGS.use_tpu,
train_batch_size=FLAGS.batch_size,
eval_batch_size=FLAGS.batch_size,
predict_batch_size=FLAGS.batch_size,
config=run_config,
params={
# Name of the feature columns in the input data.
"feature_columns": my_feature_columns,
# Two hidden layers of 10 nodes each.
"hidden_units": [10, 10],
# The model must choose between 3 classes.
"n_classes": 3,
"use_tpu": FLAGS.use_tpu,
})
Trainingsmethode anrufen
Die nächste Änderung ist die Aktualisierung der Trainingsmethode. Zum Aufrufen der Funktion train_input_fn
wird eine Lambda-Funktion verwendet. Diese Methode erleichtert die Verwendung Ihrer vorhandenen Funktionen mit der TPUEstimator API.
Ändern Sie außerdem den Parameter "steps" in max_steps
. Im nächsten Abschnitt verwenden Sie den Parameter "steps" noch einmal, um die Anzahl der Bewertungsschritte anzugeben.
Estimator API
# Train the Model.
classifier.train(
input_fn=lambda:iris_data.train_input_fn(
train_x, train_y, FLAGS.batch_size),
steps=FLAGS.train_steps)
TPUEstimator API
# Train the Model.
classifier.train(
input_fn=lambda params: iris_data.train_input_fn(
train_x, train_y, params["batch_size"]),
max_steps=FLAGS.train_steps)
Bewertungsmethode aufrufen
Diese Änderung ähnelt der, die Sie an der Trainingsmethode vorgenommen haben. Die Verwendung einer Lambda-Funktion erleichtert wiederum die Verwendung einer vorhandenen Bewertungseingabefunktion.
Darüber hinaus müssen Sie den Parameter steps
in den Wert ändern, der über das Befehlszeilen-Flag eval_steps
festgelegt wurde.
Estimator API
# Evaluate the model.
eval_result = classifier.evaluate(
input_fn=lambda:iris_data.eval_input_fn(
test_x, test_y, FLAGS.batch_size))
print('\nTest set accuracy: {accuracy:0.3f}\n'.format(**eval_result))
TPUEstimator API
# Evaluate the model.
eval_result = classifier.evaluate(
input_fn=lambda params: iris_data.eval_input_fn(
test_x, test_y, params["batch_size"]),
steps=FLAGS.eval_steps)
Vorhersagemethode aufrufen
Wie auch bei Schulungs- und Bewertungsmethoden müssen Sie die Vorhersagemethode aktualisieren. Die Verwendung einer Lambda-Funktion erleichtert wiederum die Verwendung einer vorhandenen Auswertungseingabefunktion.
Estimator API
# Generate predictions from the model
predictions = classifier.predict(
input_fn=lambda: iris_data.eval_input_fn(
iris_data.PREDICTION_INPUT_DATA,
labels=None,
batch_size=FLAGS.batch_size))
for pred_dict, expec in zip(predictions, iris_data.PREDICTION_OUTPUT_DATA):
template = ('\nPrediction is "{}" ({:.1f}%), expected "{}"')
class_id = pred_dict['class_ids'][0]
probability = pred_dict['probabilities'][class_id]
print(template.format(iris_data.SPECIES[class_id],
100 * probability, expec))
TPUEstimator API
# Generate predictions from the model
predictions = classifier.predict(
input_fn=lambda params: iris_data.predict_input_fn(
iris_data.PREDICTION_INPUT_DATA, params["batch_size"]))
for pred_dict, expec in zip(predictions, iris_data.PREDICTION_OUTPUT_DATA):
template = ("\nPrediction is \"{}\" ({:.1f}%), expected \"{}\"")
class_id = pred_dict["class_ids"][0]
probability = pred_dict["probabilities"][class_id]
print(template.format(iris_data.SPECIES[class_id],
100 * probability, expec))
Bereinigen
So vermeiden Sie, dass Ihrem GCP-Konto die in diesem Thema verwendeten Ressourcen in Rechnung gestellt werden:
Trennen Sie die Verbindung zur Compute Engine-VM:
(vm)$ exit
Die Eingabeaufforderung sollte nun
username@projectname
lauten, womit angezeigt wird, dass Sie sich in Cloud Shell befinden.Führen Sie in Cloud Shell den Befehl
ctpu delete
mit dem Flag "--zone" aus, das Sie auch beim Einrichten der Cloud TPU angegeben haben, um die Compute Engine-VM und die Cloud TPU zu löschen:$ ctpu delete [optional: --zone]
Führen Sie
ctpu status
aus, um zu bestätigen, dass keine Instanzen zugeordnet wurden. So vermeiden Sie unnötige Gebühren für die TPU-Nutzung. Der Löschvorgang kann einige Minuten dauern. Eine Antwort wie die folgende gibt an, dass keine weiteren Instanzen vorhanden sind:$ ctpu status --zone=europe-west4-a
2018/04/28 16:16:23 WARNING: Setting zone to "--zone=europe-west4-a" No instances currently exist. Compute Engine VM: -- Cloud TPU: --
Führen Sie
gsutil
wie angegeben aus und ersetzen Sie bucket-name durch den Namen des Cloud Storage-Buckets, den Sie für diese Anleitung erstellt haben:$ gsutil rm -r gs://bucket-name
Weitere Informationen
Mehr über die Estimator- und TPUEstimator APIs finden Sie in den folgenden Themen:
- Estimator API
- TPUEstimator API