ดูบน TensorFlow.org | ทำงานใน Google Colab | ดูแหล่งที่มาบน GitHub | ดาวน์โหลดโน๊ตบุ๊ค |
เอกสารนี้แนะนำ tf.estimator
— TensorFlow API ระดับสูง เครื่องมือประมาณการสรุปการดำเนินการต่อไปนี้:
- การฝึกอบรม
- การประเมิน
- การทำนาย
- ส่งออกเพื่อให้บริการ
TensorFlow ใช้ตัวประมาณการที่สร้างไว้ล่วงหน้าหลายตัว ตัวประมาณค่าที่กำหนดเองยังคงได้รับการสนับสนุน แต่ส่วนใหญ่เป็นการวัดความเข้ากันได้แบบย้อนหลัง ไม่ควรใช้ตัวประมาณแบบกำหนดเองสำหรับโค้ดใหม่ เครื่องมือประมาณการทั้งหมด—แบบที่สร้างไว้ล่วงหน้าหรือแบบกำหนดเอง—เป็นคลาสที่ยึดตามคลาส tf.estimator.Estimator
สำหรับตัวอย่างสั้นๆ ให้ลองใช้ บทแนะนำเครื่องมือประมาณการ สำหรับภาพรวมของการออกแบบ API ให้ดูที่ เอกสาร ทางเทคนิค
ติดตั้ง
pip install -U tensorflow_datasets
import tempfile
import os
import tensorflow as tf
import tensorflow_datasets as tfds
ข้อดี
คล้ายกับ tf.keras.Model
estimator
คือนามธรรมระดับแบบจำลอง tf.estimator
ให้ความสามารถบางอย่างที่ขณะนี้ยังอยู่ระหว่างการพัฒนาสำหรับ tf.keras
เหล่านี้คือ:
- การฝึกอบรมตามเซิร์ฟเวอร์พารามิเตอร์
- บูรณาการ TFX เต็มรูปแบบ
ความสามารถในการประมาณการ
เครื่องมือประมาณการมีประโยชน์ดังต่อไปนี้:
- คุณสามารถรันโมเดลที่อิงกับ Estimator บนโลคัลโฮสต์หรือบนสภาพแวดล้อมแบบหลายเซิร์ฟเวอร์แบบกระจายโดยไม่ต้องเปลี่ยนโมเดลของคุณ นอกจากนี้ คุณยังสามารถเรียกใช้โมเดลที่อิงกับเครื่องมือประมาณการบน CPU, GPU หรือ TPU ได้โดยไม่ต้องเข้ารหัสโมเดลของคุณ
- เครื่องมือประมาณการจัดเตรียมลูปการฝึกอบรมแบบกระจายที่ปลอดภัย ซึ่งควบคุมวิธีการและเวลาในการ:
- โหลดข้อมูล
- จัดการข้อยกเว้น
- สร้างไฟล์ด่านและกู้คืนจากความล้มเหลว
- บันทึกสรุปสำหรับ TensorBoard
เมื่อเขียนแอปพลิเคชันด้วย Estimators คุณต้องแยกไปป์ไลน์การป้อนข้อมูลออกจากโมเดล การแยกนี้ทำให้การทดลองกับชุดข้อมูลต่างๆ ง่ายขึ้น
การใช้ตัวประมาณการที่สร้างไว้ล่วงหน้า
เครื่องมือประมาณการที่ทำไว้ล่วงหน้าช่วยให้คุณทำงานในระดับแนวความคิดที่สูงกว่า TensorFlow API พื้นฐานมาก คุณไม่ต้องกังวลกับการสร้างกราฟการคำนวณหรือเซสชันอีกต่อไป เนื่องจากเครื่องมือประมาณการจะจัดการ "ระบบประปา" ทั้งหมดให้คุณ นอกจากนี้ เครื่องมือประมาณการที่สร้างไว้ล่วงหน้ายังให้คุณทดลองกับสถาปัตยกรรมแบบจำลองต่างๆ โดยทำการเปลี่ยนแปลงโค้ดเพียงเล็กน้อยเท่านั้น ตัวอย่างเช่น tf.estimator.DNNClassifier
เป็นคลาส Estimator ที่สร้างไว้ล่วงหน้าซึ่งฝึกโมเดลการจำแนกตามเครือข่ายนิวรัลฟีดฟอร์เวิร์ดที่มีความหนาแน่นสูง
โปรแกรม TensorFlow ที่ใช้ตัวประมาณการที่สร้างไว้ล่วงหน้ามักจะประกอบด้วยสี่ขั้นตอนต่อไปนี้:
1. เขียนฟังก์ชันอินพุต
ตัวอย่างเช่น คุณอาจสร้างฟังก์ชันหนึ่งเพื่อนำเข้าชุดการฝึก และอีกฟังก์ชันหนึ่งเพื่อนำเข้าชุดทดสอบ ผู้ประมาณค่าคาดหวังว่าอินพุตของพวกเขาจะถูกจัดรูปแบบเป็นคู่ของอ็อบเจ็กต์:
- พจนานุกรมที่คีย์เป็นชื่อคุณสมบัติและค่าคือเทนเซอร์ (หรือ SparseTensors) ที่มีข้อมูลคุณสมบัติที่เกี่ยวข้อง
- เทนเซอร์ที่มีป้ายกำกับอย่างน้อยหนึ่งรายการ
input_fn
ควรส่งคืน tf.data.Dataset
ที่ให้คู่ในรูปแบบนั้น
ตัวอย่างเช่น โค้ดต่อไปนี้สร้าง tf.data.Dataset
จากไฟล์ train.csv
ของชุดข้อมูล Titanic:
def train_input_fn():
titanic_file = tf.keras.utils.get_file("train.csv", "https://storage.googleapis.com/tf-datasets/titanic/train.csv")
titanic = tf.data.experimental.make_csv_dataset(
titanic_file, batch_size=32,
label_name="survived")
titanic_batches = (
titanic.cache().repeat().shuffle(500)
.prefetch(tf.data.AUTOTUNE))
return titanic_batches
input_fn
ถูกดำเนินการใน tf.Graph
และยังสามารถส่งคืนคู่ (features_dics, labels)
ที่มีกราฟเทนเซอร์ได้โดยตรง แต่นี่เป็นข้อผิดพลาดที่มักเกิดขึ้นนอกกรณีธรรมดา เช่น การคืนค่าคงที่
2. กำหนดคอลัมน์คุณลักษณะ
tf.feature_column
แต่ละอันจะระบุชื่อคุณลักษณะ ประเภทของคุณลักษณะ และการประมวลผลล่วงหน้าของอินพุตใดๆ
ตัวอย่างเช่น ตัวอย่างต่อไปนี้สร้างคอลัมน์คุณลักษณะสามคอลัมน์
- อย่างแรกใช้คุณสมบัติ
age
โดยตรงเป็นอินพุตแบบทศนิยม - ประการที่สองใช้คุณสมบัติ
class
เป็นอินพุตหมวดหมู่ - ส่วนที่สามใช้
embark_town
เป็นข้อมูลเข้าหมวดหมู่ แต่ใช้hashing trick
เพื่อหลีกเลี่ยงความจำเป็นในการระบุตัวเลือก และเพื่อกำหนดจำนวนตัวเลือก
สำหรับข้อมูลเพิ่มเติม โปรดดู บทแนะนำคอลัมน์คุณลักษณะ
age = tf.feature_column.numeric_column('age')
cls = tf.feature_column.categorical_column_with_vocabulary_list('class', ['First', 'Second', 'Third'])
embark = tf.feature_column.categorical_column_with_hash_bucket('embark_town', 32)
3. ยกตัวอย่างเครื่องมือประมาณการที่สร้างไว้ล่วงหน้าที่เกี่ยวข้อง
ตัวอย่างเช่น ต่อไปนี้คือตัวอย่างการสร้างอินสแตนซ์ของ Estimator ที่สร้างไว้ล่วงหน้าชื่อ LinearClassifier
:
model_dir = tempfile.mkdtemp()
model = tf.estimator.LinearClassifier(
model_dir=model_dir,
feature_columns=[embark, cls, age],
n_classes=2
)
INFO:tensorflow:Using default config. INFO:tensorflow:Using config: {'_model_dir': '/tmp/tmpl24pp3cp', '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_steps': None, '_save_checkpoints_secs': 600, '_session_config': allow_soft_placement: true graph_options { rewrite_options { meta_optimizer_iterations: ONE } } , '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_log_step_count_steps': 100, '_train_distribute': None, '_device_fn': None, '_protocol': None, '_eval_distribute': None, '_experimental_distribute': None, '_experimental_max_worker_delay_secs': None, '_session_creation_timeout_secs': 7200, '_checkpoint_save_graph_def': True, '_service': None, '_cluster_spec': ClusterSpec({}), '_task_type': 'worker', '_task_id': 0, '_global_id_in_cluster': 0, '_master': '', '_evaluation_master': '', '_is_chief': True, '_num_ps_replicas': 0, '_num_worker_replicas': 1}
สำหรับข้อมูลเพิ่มเติม คุณสามารถไปที่บทช่วย สอนตัวแยกประเภทเชิงเส้น
4. เรียกวิธีการฝึกอบรม การประเมิน หรือการอนุมาน
เครื่องมือประมาณการทั้งหมดจัดเตรียมวิธีการ train
evaluate
และ predict
model = model.train(input_fn=train_input_fn, steps=100)
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/training/training_util.py:236: Variable.initialized_value (from tensorflow.python.ops.variables) is deprecated and will be removed in a future version. Instructions for updating: Use Variable.read_value. Variables in 2.X are initialized automatically both in eager and graph (inside tf.defun) contexts. INFO:tensorflow:Calling model_fn. /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/keras/engine/base_layer_v1.py:1684: UserWarning: `layer.add_variable` is deprecated and will be removed in a future version. Please use `layer.add_weight` method instead. warnings.warn('`layer.add_variable` is deprecated and ' WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/keras/optimizer_v2/ftrl.py:147: calling Constant.__init__ (from tensorflow.python.ops.init_ops) with dtype is deprecated and will be removed in a future version. Instructions for updating: Call initializer instance with the dtype argument instead of passing it to the constructor INFO:tensorflow:Done calling model_fn. INFO:tensorflow:Create CheckpointSaverHook. INFO:tensorflow:Graph was finalized. INFO:tensorflow:Running local_init_op. INFO:tensorflow:Done running local_init_op. INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 0... INFO:tensorflow:Saving checkpoints for 0 into /tmp/tmpl24pp3cp/model.ckpt. INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 0... INFO:tensorflow:loss = 0.6931472, step = 0 INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 100... INFO:tensorflow:Saving checkpoints for 100 into /tmp/tmpl24pp3cp/model.ckpt. INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 100... INFO:tensorflow:Loss for final step: 0.6319582. 2021-09-22 20:49:10.453286: W tensorflow/core/kernels/data/cache_dataset_ops.cc:768] The calling iterator did not fully read the dataset being cached. In order to avoid unexpected truncation of the dataset, the partially cached contents of the dataset will be discarded. This can happen if you have an input pipeline similar to `dataset.cache().take(k).repeat()`. You should use `dataset.take(k).cache().repeat()` instead.
result = model.evaluate(train_input_fn, steps=10)
for key, value in result.items():
print(key, ":", value)
INFO:tensorflow:Calling model_fn. INFO:tensorflow:Done calling model_fn. INFO:tensorflow:Starting evaluation at 2021-09-22T20:49:11 INFO:tensorflow:Graph was finalized. INFO:tensorflow:Restoring parameters from /tmp/tmpl24pp3cp/model.ckpt-100 INFO:tensorflow:Running local_init_op. INFO:tensorflow:Done running local_init_op. INFO:tensorflow:Evaluation [1/10] INFO:tensorflow:Evaluation [2/10] INFO:tensorflow:Evaluation [3/10] INFO:tensorflow:Evaluation [4/10] INFO:tensorflow:Evaluation [5/10] INFO:tensorflow:Evaluation [6/10] INFO:tensorflow:Evaluation [7/10] INFO:tensorflow:Evaluation [8/10] INFO:tensorflow:Evaluation [9/10] INFO:tensorflow:Evaluation [10/10] INFO:tensorflow:Inference Time : 0.74609s INFO:tensorflow:Finished evaluation at 2021-09-22-20:49:12 INFO:tensorflow:Saving dict for global step 100: accuracy = 0.734375, accuracy_baseline = 0.640625, auc = 0.7373913, auc_precision_recall = 0.64306235, average_loss = 0.563341, global_step = 100, label/mean = 0.359375, loss = 0.563341, precision = 0.734375, prediction/mean = 0.3463129, recall = 0.40869564 INFO:tensorflow:Saving 'checkpoint_path' summary for global step 100: /tmp/tmpl24pp3cp/model.ckpt-100 accuracy : 0.734375 accuracy_baseline : 0.640625 auc : 0.7373913 auc_precision_recall : 0.64306235 average_loss : 0.563341 label/mean : 0.359375 loss : 0.563341 precision : 0.734375 prediction/mean : 0.3463129 recall : 0.40869564 global_step : 100 2021-09-22 20:49:12.168629: W tensorflow/core/kernels/data/cache_dataset_ops.cc:768] The calling iterator did not fully read the dataset being cached. In order to avoid unexpected truncation of the dataset, the partially cached contents of the dataset will be discarded. This can happen if you have an input pipeline similar to `dataset.cache().take(k).repeat()`. You should use `dataset.take(k).cache().repeat()` instead.
for pred in model.predict(train_input_fn):
for key, value in pred.items():
print(key, ":", value)
break
INFO:tensorflow:Calling model_fn. INFO:tensorflow:Done calling model_fn. INFO:tensorflow:Graph was finalized. INFO:tensorflow:Restoring parameters from /tmp/tmpl24pp3cp/model.ckpt-100 INFO:tensorflow:Running local_init_op. INFO:tensorflow:Done running local_init_op. logits : [-1.5173098] logistic : [0.17985801] probabilities : [0.820142 0.17985801] class_ids : [0] classes : [b'0'] all_class_ids : [0 1] all_classes : [b'0' b'1'] 2021-09-22 20:49:13.076528: W tensorflow/core/kernels/data/cache_dataset_ops.cc:768] The calling iterator did not fully read the dataset being cached. In order to avoid unexpected truncation of the dataset, the partially cached contents of the dataset will be discarded. This can happen if you have an input pipeline similar to `dataset.cache().take(k).repeat()`. You should use `dataset.take(k).cache().repeat()` instead.
ประโยชน์ของเครื่องมือประมาณการที่ทำไว้ล่วงหน้า
เครื่องมือประมาณการที่ทำไว้ล่วงหน้าจะเข้ารหัสแนวปฏิบัติที่ดีที่สุด โดยให้ประโยชน์ดังต่อไปนี้:
- แนวทางปฏิบัติที่ดีที่สุดในการพิจารณาว่าส่วนต่างๆ ของกราฟการคำนวณควรทำงานที่ใด โดยใช้กลยุทธ์ในเครื่องเดียวหรือบนคลัสเตอร์
- แนวทางปฏิบัติที่ดีที่สุดสำหรับการเขียนเหตุการณ์ (สรุป) และบทสรุปที่เป็นประโยชน์ในระดับสากล
หากคุณไม่ได้ใช้เครื่องมือประมาณการที่สร้างไว้ล่วงหน้า คุณต้องใช้คุณลักษณะก่อนหน้าด้วยตนเอง
เครื่องมือประมาณการแบบกำหนดเอง
หัวใจของ Estimator ทุกตัว ไม่ว่าจะเป็นแบบสำเร็จรูปหรือแบบกำหนดเองก็ตาม คือ model function , model_fn
ซึ่งเป็นวิธีการที่สร้างกราฟสำหรับการฝึกอบรม การประเมิน และการทำนาย เมื่อคุณใช้ตัวประมาณการที่สร้างไว้ล่วงหน้า แสดงว่ามีบุคคลอื่นใช้งานฟังก์ชันแบบจำลองแล้ว เมื่ออาศัยเครื่องมือประมาณการแบบกำหนดเอง คุณต้องเขียนฟังก์ชันแบบจำลองด้วยตนเอง
สร้างตัวประมาณจากแบบจำลอง Keras
คุณสามารถแปลงโมเดล Keras ที่มีอยู่เป็นตัวประมาณด้วย tf.keras.estimator.model_to_estimator
สิ่งนี้มีประโยชน์หากคุณต้องการปรับปรุงโค้ดโมเดลของคุณให้ทันสมัย แต่ไปป์ไลน์การฝึกอบรมของคุณยังคงต้องใช้ตัวประมาณ
สร้างอินสแตนซ์โมเดล Keras MobileNet V2 และคอมไพล์โมเดลด้วยตัวเพิ่มประสิทธิภาพ การสูญเสีย และตัววัดเพื่อฝึกด้วย:
keras_mobilenet_v2 = tf.keras.applications.MobileNetV2(
input_shape=(160, 160, 3), include_top=False)
keras_mobilenet_v2.trainable = False
estimator_model = tf.keras.Sequential([
keras_mobilenet_v2,
tf.keras.layers.GlobalAveragePooling2D(),
tf.keras.layers.Dense(1)
])
# Compile the model
estimator_model.compile(
optimizer='adam',
loss=tf.keras.losses.BinaryCrossentropy(from_logits=True),
metrics=['accuracy'])
Downloading data from https://storage.googleapis.com/tensorflow/keras-applications/mobilenet_v2/mobilenet_v2_weights_tf_dim_ordering_tf_kernels_1.0_160_no_top.h5 9412608/9406464 [==============================] - 0s 0us/step 9420800/9406464 [==============================] - 0s 0us/step
สร้าง Estimator
จากโมเดล Keras ที่คอมไพล์แล้ว สถานะโมเดลเริ่มต้นของโมเดล Keras ถูกเก็บรักษาไว้ใน Estimator
ที่สร้างขึ้น:
est_mobilenet_v2 = tf.keras.estimator.model_to_estimator(keras_model=estimator_model)
INFO:tensorflow:Using default config. WARNING:tensorflow:Using temporary folder as model directory: /tmp/tmpmosnmied INFO:tensorflow:Using the Keras model provided. /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/keras/backend.py:401: UserWarning: `tf.keras.backend.set_learning_phase` is deprecated and will be removed after 2020-10-11. To update it, simply pass a True/False value to the `training` argument of the `__call__` method of your layer or model. warnings.warn('`tf.keras.backend.set_learning_phase` is deprecated and ' /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/keras/utils/generic_utils.py:497: CustomMaskWarning: Custom mask layers require a config and must override get_config. When loading, the custom mask layer must be passed to the custom_objects argument. category=CustomMaskWarning) INFO:tensorflow:Using config: {'_model_dir': '/tmp/tmpmosnmied', '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_steps': None, '_save_checkpoints_secs': 600, '_session_config': allow_soft_placement: true graph_options { rewrite_options { meta_optimizer_iterations: ONE } } , '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_log_step_count_steps': 100, '_train_distribute': None, '_device_fn': None, '_protocol': None, '_eval_distribute': None, '_experimental_distribute': None, '_experimental_max_worker_delay_secs': None, '_session_creation_timeout_secs': 7200, '_checkpoint_save_graph_def': True, '_service': None, '_cluster_spec': ClusterSpec({}), '_task_type': 'worker', '_task_id': 0, '_global_id_in_cluster': 0, '_master': '', '_evaluation_master': '', '_is_chief': True, '_num_ps_replicas': 0, '_num_worker_replicas': 1}
ปฏิบัติต่อ Estimator
ที่ได้รับเช่นเดียวกับที่คุณทำกับ Estimator
อื่นๆ
IMG_SIZE = 160 # All images will be resized to 160x160
def preprocess(image, label):
image = tf.cast(image, tf.float32)
image = (image/127.5) - 1
image = tf.image.resize(image, (IMG_SIZE, IMG_SIZE))
return image, label
def train_input_fn(batch_size):
data = tfds.load('cats_vs_dogs', as_supervised=True)
train_data = data['train']
train_data = train_data.map(preprocess).shuffle(500).batch(batch_size)
return train_data
ในการฝึก ให้เรียกใช้ฟังก์ชันรถไฟของ Estimator:
est_mobilenet_v2.train(input_fn=lambda: train_input_fn(32), steps=50)
INFO:tensorflow:Calling model_fn. INFO:tensorflow:Calling model_fn. INFO:tensorflow:Done calling model_fn. INFO:tensorflow:Done calling model_fn. INFO:tensorflow:Warm-starting with WarmStartSettings: WarmStartSettings(ckpt_to_initialize_from='/tmp/tmpmosnmied/keras/keras_model.ckpt', vars_to_warm_start='.*', var_name_to_vocab_info={}, var_name_to_prev_var_name={}) INFO:tensorflow:Warm-starting with WarmStartSettings: WarmStartSettings(ckpt_to_initialize_from='/tmp/tmpmosnmied/keras/keras_model.ckpt', vars_to_warm_start='.*', var_name_to_vocab_info={}, var_name_to_prev_var_name={}) INFO:tensorflow:Warm-starting from: /tmp/tmpmosnmied/keras/keras_model.ckpt INFO:tensorflow:Warm-starting from: /tmp/tmpmosnmied/keras/keras_model.ckpt INFO:tensorflow:Warm-starting variables only in TRAINABLE_VARIABLES. INFO:tensorflow:Warm-starting variables only in TRAINABLE_VARIABLES. INFO:tensorflow:Warm-started 158 variables. INFO:tensorflow:Warm-started 158 variables. INFO:tensorflow:Create CheckpointSaverHook. INFO:tensorflow:Create CheckpointSaverHook. INFO:tensorflow:Graph was finalized. INFO:tensorflow:Graph was finalized. INFO:tensorflow:Running local_init_op. INFO:tensorflow:Running local_init_op. INFO:tensorflow:Done running local_init_op. INFO:tensorflow:Done running local_init_op. INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 0... INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 0... INFO:tensorflow:Saving checkpoints for 0 into /tmp/tmpmosnmied/model.ckpt. INFO:tensorflow:Saving checkpoints for 0 into /tmp/tmpmosnmied/model.ckpt. INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 0... INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 0... INFO:tensorflow:loss = 0.6994096, step = 0 INFO:tensorflow:loss = 0.6994096, step = 0 INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 50... INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 50... INFO:tensorflow:Saving checkpoints for 50 into /tmp/tmpmosnmied/model.ckpt. INFO:tensorflow:Saving checkpoints for 50 into /tmp/tmpmosnmied/model.ckpt. INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 50... INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 50... INFO:tensorflow:Loss for final step: 0.68789804. INFO:tensorflow:Loss for final step: 0.68789804. <tensorflow_estimator.python.estimator.estimator.EstimatorV2 at 0x7f4b1c1e9890>
ในทำนองเดียวกัน ในการประเมิน ให้เรียกใช้ฟังก์ชันการประเมินของ Estimator:
est_mobilenet_v2.evaluate(input_fn=lambda: train_input_fn(32), steps=10)
INFO:tensorflow:Calling model_fn. INFO:tensorflow:Calling model_fn. /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/keras/engine/training.py:2470: UserWarning: `Model.state_updates` will be removed in a future version. This property should not be used in TensorFlow 2.0, as `updates` are applied automatically. warnings.warn('`Model.state_updates` will be removed in a future version. ' INFO:tensorflow:Done calling model_fn. INFO:tensorflow:Done calling model_fn. INFO:tensorflow:Starting evaluation at 2021-09-22T20:49:36 INFO:tensorflow:Starting evaluation at 2021-09-22T20:49:36 INFO:tensorflow:Graph was finalized. INFO:tensorflow:Graph was finalized. INFO:tensorflow:Restoring parameters from /tmp/tmpmosnmied/model.ckpt-50 INFO:tensorflow:Restoring parameters from /tmp/tmpmosnmied/model.ckpt-50 INFO:tensorflow:Running local_init_op. INFO:tensorflow:Running local_init_op. INFO:tensorflow:Done running local_init_op. INFO:tensorflow:Done running local_init_op. INFO:tensorflow:Evaluation [1/10] INFO:tensorflow:Evaluation [1/10] INFO:tensorflow:Evaluation [2/10] INFO:tensorflow:Evaluation [2/10] INFO:tensorflow:Evaluation [3/10] INFO:tensorflow:Evaluation [3/10] INFO:tensorflow:Evaluation [4/10] INFO:tensorflow:Evaluation [4/10] INFO:tensorflow:Evaluation [5/10] INFO:tensorflow:Evaluation [5/10] INFO:tensorflow:Evaluation [6/10] INFO:tensorflow:Evaluation [6/10] INFO:tensorflow:Evaluation [7/10] INFO:tensorflow:Evaluation [7/10] INFO:tensorflow:Evaluation [8/10] INFO:tensorflow:Evaluation [8/10] INFO:tensorflow:Evaluation [9/10] INFO:tensorflow:Evaluation [9/10] INFO:tensorflow:Evaluation [10/10] INFO:tensorflow:Evaluation [10/10] INFO:tensorflow:Inference Time : 3.89658s INFO:tensorflow:Inference Time : 3.89658s INFO:tensorflow:Finished evaluation at 2021-09-22-20:49:39 INFO:tensorflow:Finished evaluation at 2021-09-22-20:49:39 INFO:tensorflow:Saving dict for global step 50: accuracy = 0.525, global_step = 50, loss = 0.6723582 INFO:tensorflow:Saving dict for global step 50: accuracy = 0.525, global_step = 50, loss = 0.6723582 INFO:tensorflow:Saving 'checkpoint_path' summary for global step 50: /tmp/tmpmosnmied/model.ckpt-50 INFO:tensorflow:Saving 'checkpoint_path' summary for global step 50: /tmp/tmpmosnmied/model.ckpt-50 {'accuracy': 0.525, 'loss': 0.6723582, 'global_step': 50}ตัวยึดตำแหน่ง22
สำหรับรายละเอียดเพิ่มเติม โปรดดูเอกสารประกอบสำหรับ tf.keras.estimator.model_to_estimator
การบันทึกจุดตรวจตามวัตถุด้วย Estimator
โดยค่าเริ่มต้น เครื่องมือประมาณการจะบันทึกจุดตรวจสอบด้วยชื่อตัวแปร แทนที่จะเป็นกราฟวัตถุที่อธิบายไว้ใน คู่มือจุดตรวจ tf.train.Checkpoint
จะอ่านจุดตรวจสอบตามชื่อ แต่ชื่อตัวแปรอาจเปลี่ยนแปลงได้เมื่อย้ายส่วนต่างๆ ของแบบจำลองไปนอก model_fn
ของ Estimator สำหรับจุดตรวจสอบตามอ็อบเจ็กต์ที่บันทึกความเข้ากันได้ของการส่งต่อจะทำให้การฝึกโมเดลภายใน Estimator ง่ายขึ้นและใช้งานภายนอกโมเดล
import tensorflow.compat.v1 as tf_compat
def toy_dataset():
inputs = tf.range(10.)[:, None]
labels = inputs * 5. + tf.range(5.)[None, :]
return tf.data.Dataset.from_tensor_slices(
dict(x=inputs, y=labels)).repeat().batch(2)
class Net(tf.keras.Model):
"""A simple linear model."""
def __init__(self):
super(Net, self).__init__()
self.l1 = tf.keras.layers.Dense(5)
def call(self, x):
return self.l1(x)
def model_fn(features, labels, mode):
net = Net()
opt = tf.keras.optimizers.Adam(0.1)
ckpt = tf.train.Checkpoint(step=tf_compat.train.get_global_step(),
optimizer=opt, net=net)
with tf.GradientTape() as tape:
output = net(features['x'])
loss = tf.reduce_mean(tf.abs(output - features['y']))
variables = net.trainable_variables
gradients = tape.gradient(loss, variables)
return tf.estimator.EstimatorSpec(
mode,
loss=loss,
train_op=tf.group(opt.apply_gradients(zip(gradients, variables)),
ckpt.step.assign_add(1)),
# Tell the Estimator to save "ckpt" in an object-based format.
scaffold=tf_compat.train.Scaffold(saver=ckpt))
tf.keras.backend.clear_session()
est = tf.estimator.Estimator(model_fn, './tf_estimator_example/')
est.train(toy_dataset, steps=10)
INFO:tensorflow:Using default config. INFO:tensorflow:Using default config. INFO:tensorflow:Using config: {'_model_dir': './tf_estimator_example/', '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_steps': None, '_save_checkpoints_secs': 600, '_session_config': allow_soft_placement: true graph_options { rewrite_options { meta_optimizer_iterations: ONE } } , '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_log_step_count_steps': 100, '_train_distribute': None, '_device_fn': None, '_protocol': None, '_eval_distribute': None, '_experimental_distribute': None, '_experimental_max_worker_delay_secs': None, '_session_creation_timeout_secs': 7200, '_checkpoint_save_graph_def': True, '_service': None, '_cluster_spec': ClusterSpec({}), '_task_type': 'worker', '_task_id': 0, '_global_id_in_cluster': 0, '_master': '', '_evaluation_master': '', '_is_chief': True, '_num_ps_replicas': 0, '_num_worker_replicas': 1} INFO:tensorflow:Using config: {'_model_dir': './tf_estimator_example/', '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_steps': None, '_save_checkpoints_secs': 600, '_session_config': allow_soft_placement: true graph_options { rewrite_options { meta_optimizer_iterations: ONE } } , '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_log_step_count_steps': 100, '_train_distribute': None, '_device_fn': None, '_protocol': None, '_eval_distribute': None, '_experimental_distribute': None, '_experimental_max_worker_delay_secs': None, '_session_creation_timeout_secs': 7200, '_checkpoint_save_graph_def': True, '_service': None, '_cluster_spec': ClusterSpec({}), '_task_type': 'worker', '_task_id': 0, '_global_id_in_cluster': 0, '_master': '', '_evaluation_master': '', '_is_chief': True, '_num_ps_replicas': 0, '_num_worker_replicas': 1} INFO:tensorflow:Calling model_fn. INFO:tensorflow:Calling model_fn. INFO:tensorflow:Done calling model_fn. INFO:tensorflow:Done calling model_fn. INFO:tensorflow:Create CheckpointSaverHook. INFO:tensorflow:Create CheckpointSaverHook. INFO:tensorflow:Graph was finalized. INFO:tensorflow:Graph was finalized. INFO:tensorflow:Running local_init_op. INFO:tensorflow:Running local_init_op. INFO:tensorflow:Done running local_init_op. INFO:tensorflow:Done running local_init_op. INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 0... INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 0... INFO:tensorflow:Saving checkpoints for 0 into ./tf_estimator_example/model.ckpt. INFO:tensorflow:Saving checkpoints for 0 into ./tf_estimator_example/model.ckpt. INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 0... INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 0... INFO:tensorflow:loss = 4.659403, step = 0 INFO:tensorflow:loss = 4.659403, step = 0 INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 10... INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 10... INFO:tensorflow:Saving checkpoints for 10 into ./tf_estimator_example/model.ckpt. INFO:tensorflow:Saving checkpoints for 10 into ./tf_estimator_example/model.ckpt. INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 10... INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 10... INFO:tensorflow:Loss for final step: 39.58891. INFO:tensorflow:Loss for final step: 39.58891. <tensorflow_estimator.python.estimator.estimator.EstimatorV2 at 0x7f4b7c451fd0>
tf.train.Checkpoint
สามารถโหลดจุดตรวจของ Estimator จาก model_dir
ได้
opt = tf.keras.optimizers.Adam(0.1)
net = Net()
ckpt = tf.train.Checkpoint(
step=tf.Variable(1, dtype=tf.int64), optimizer=opt, net=net)
ckpt.restore(tf.train.latest_checkpoint('./tf_estimator_example/'))
ckpt.step.numpy() # From est.train(..., steps=10)
10
โมเดลที่บันทึกไว้จากเครื่องมือประมาณการ
เครื่องมือประมาณการเอ็กซ์พอร์ต SavedModels ผ่าน tf.Estimator.export_saved_model
input_column = tf.feature_column.numeric_column("x")
estimator = tf.estimator.LinearClassifier(feature_columns=[input_column])
def input_fn():
return tf.data.Dataset.from_tensor_slices(
({"x": [1., 2., 3., 4.]}, [1, 1, 0, 0])).repeat(200).shuffle(64).batch(16)
estimator.train(input_fn)
INFO:tensorflow:Using default config. INFO:tensorflow:Using default config. WARNING:tensorflow:Using temporary folder as model directory: /tmp/tmp30_d7xz6 WARNING:tensorflow:Using temporary folder as model directory: /tmp/tmp30_d7xz6 INFO:tensorflow:Using config: {'_model_dir': '/tmp/tmp30_d7xz6', '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_steps': None, '_save_checkpoints_secs': 600, '_session_config': allow_soft_placement: true graph_options { rewrite_options { meta_optimizer_iterations: ONE } } , '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_log_step_count_steps': 100, '_train_distribute': None, '_device_fn': None, '_protocol': None, '_eval_distribute': None, '_experimental_distribute': None, '_experimental_max_worker_delay_secs': None, '_session_creation_timeout_secs': 7200, '_checkpoint_save_graph_def': True, '_service': None, '_cluster_spec': ClusterSpec({}), '_task_type': 'worker', '_task_id': 0, '_global_id_in_cluster': 0, '_master': '', '_evaluation_master': '', '_is_chief': True, '_num_ps_replicas': 0, '_num_worker_replicas': 1} INFO:tensorflow:Using config: {'_model_dir': '/tmp/tmp30_d7xz6', '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_steps': None, '_save_checkpoints_secs': 600, '_session_config': allow_soft_placement: true graph_options { rewrite_options { meta_optimizer_iterations: ONE } } , '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_log_step_count_steps': 100, '_train_distribute': None, '_device_fn': None, '_protocol': None, '_eval_distribute': None, '_experimental_distribute': None, '_experimental_max_worker_delay_secs': None, '_session_creation_timeout_secs': 7200, '_checkpoint_save_graph_def': True, '_service': None, '_cluster_spec': ClusterSpec({}), '_task_type': 'worker', '_task_id': 0, '_global_id_in_cluster': 0, '_master': '', '_evaluation_master': '', '_is_chief': True, '_num_ps_replicas': 0, '_num_worker_replicas': 1} INFO:tensorflow:Calling model_fn. INFO:tensorflow:Calling model_fn. INFO:tensorflow:Done calling model_fn. INFO:tensorflow:Done calling model_fn. INFO:tensorflow:Create CheckpointSaverHook. INFO:tensorflow:Create CheckpointSaverHook. INFO:tensorflow:Graph was finalized. INFO:tensorflow:Graph was finalized. INFO:tensorflow:Running local_init_op. INFO:tensorflow:Running local_init_op. INFO:tensorflow:Done running local_init_op. INFO:tensorflow:Done running local_init_op. INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 0... INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 0... INFO:tensorflow:Saving checkpoints for 0 into /tmp/tmp30_d7xz6/model.ckpt. INFO:tensorflow:Saving checkpoints for 0 into /tmp/tmp30_d7xz6/model.ckpt. INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 0... INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 0... INFO:tensorflow:loss = 0.6931472, step = 0 INFO:tensorflow:loss = 0.6931472, step = 0 INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 50... INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 50... INFO:tensorflow:Saving checkpoints for 50 into /tmp/tmp30_d7xz6/model.ckpt. INFO:tensorflow:Saving checkpoints for 50 into /tmp/tmp30_d7xz6/model.ckpt. INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 50... INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 50... INFO:tensorflow:Loss for final step: 0.4022895. INFO:tensorflow:Loss for final step: 0.4022895. <tensorflow_estimator.python.estimator.canned.linear.LinearClassifierV2 at 0x7f4b1c10fd10>
ในการบันทึก Estimator
คุณต้องสร้าง serving_input_receiver
ฟังก์ชันนี้สร้างส่วนหนึ่งของ tf.Graph
ที่แยกวิเคราะห์ข้อมูลดิบที่ได้รับจาก SavedModel
โมดูล tf.estimator.export
มีฟังก์ชันที่ช่วยสร้าง receivers
เหล่านี้
โค้ดต่อไปนี้สร้างเครื่องรับตาม feature_columns
ที่ยอมรับบัฟเฟอร์โปรโตคอล tf.Example
อนุกรม ซึ่งมักใช้กับ tf-serving
tmpdir = tempfile.mkdtemp()
serving_input_fn = tf.estimator.export.build_parsing_serving_input_receiver_fn(
tf.feature_column.make_parse_example_spec([input_column]))
estimator_base_path = os.path.join(tmpdir, 'from_estimator')
estimator_path = estimator.export_saved_model(estimator_base_path, serving_input_fn)
INFO:tensorflow:Calling model_fn. INFO:tensorflow:Calling model_fn. INFO:tensorflow:Done calling model_fn. INFO:tensorflow:Done calling model_fn. WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/saved_model/signature_def_utils_impl.py:145: build_tensor_info (from tensorflow.python.saved_model.utils_impl) is deprecated and will be removed in a future version. Instructions for updating: This function will only be available through the v1 compatibility library as tf.compat.v1.saved_model.utils.build_tensor_info or tf.compat.v1.saved_model.build_tensor_info. WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/saved_model/signature_def_utils_impl.py:145: build_tensor_info (from tensorflow.python.saved_model.utils_impl) is deprecated and will be removed in a future version. Instructions for updating: This function will only be available through the v1 compatibility library as tf.compat.v1.saved_model.utils.build_tensor_info or tf.compat.v1.saved_model.build_tensor_info. INFO:tensorflow:Signatures INCLUDED in export for Classify: ['serving_default', 'classification'] INFO:tensorflow:Signatures INCLUDED in export for Classify: ['serving_default', 'classification'] INFO:tensorflow:Signatures INCLUDED in export for Regress: ['regression'] INFO:tensorflow:Signatures INCLUDED in export for Regress: ['regression'] INFO:tensorflow:Signatures INCLUDED in export for Predict: ['predict'] INFO:tensorflow:Signatures INCLUDED in export for Predict: ['predict'] INFO:tensorflow:Signatures INCLUDED in export for Train: None INFO:tensorflow:Signatures INCLUDED in export for Train: None INFO:tensorflow:Signatures INCLUDED in export for Eval: None INFO:tensorflow:Signatures INCLUDED in export for Eval: None INFO:tensorflow:Restoring parameters from /tmp/tmp30_d7xz6/model.ckpt-50 INFO:tensorflow:Restoring parameters from /tmp/tmp30_d7xz6/model.ckpt-50 INFO:tensorflow:Assets added to graph. INFO:tensorflow:Assets added to graph. INFO:tensorflow:No assets to write. INFO:tensorflow:No assets to write. INFO:tensorflow:SavedModel written to: /tmp/tmpi_szzuj1/from_estimator/temp-1632343781/saved_model.pb INFO:tensorflow:SavedModel written to: /tmp/tmpi_szzuj1/from_estimator/temp-1632343781/saved_model.pbตัวยึดตำแหน่ง33
คุณยังสามารถโหลดและรันโมเดลนั้นได้จาก python:
imported = tf.saved_model.load(estimator_path)
def predict(x):
example = tf.train.Example()
example.features.feature["x"].float_list.value.extend([x])
return imported.signatures["predict"](
examples=tf.constant([example.SerializeToString()]))
print(predict(1.5))
print(predict(3.5))
{'class_ids': <tf.Tensor: shape=(1, 1), dtype=int64, numpy=array([[1]])>, 'classes': <tf.Tensor: shape=(1, 1), dtype=string, numpy=array([[b'1']], dtype=object)>, 'all_classes': <tf.Tensor: shape=(1, 2), dtype=string, numpy=array([[b'0', b'1']], dtype=object)>, 'all_class_ids': <tf.Tensor: shape=(1, 2), dtype=int32, numpy=array([[0, 1]], dtype=int32)>, 'logits': <tf.Tensor: shape=(1, 1), dtype=float32, numpy=array([[0.2974025]], dtype=float32)>, 'logistic': <tf.Tensor: shape=(1, 1), dtype=float32, numpy=array([[0.5738074]], dtype=float32)>, 'probabilities': <tf.Tensor: shape=(1, 2), dtype=float32, numpy=array([[0.42619258, 0.5738074 ]], dtype=float32)>} {'class_ids': <tf.Tensor: shape=(1, 1), dtype=int64, numpy=array([[0]])>, 'classes': <tf.Tensor: shape=(1, 1), dtype=string, numpy=array([[b'0']], dtype=object)>, 'all_classes': <tf.Tensor: shape=(1, 2), dtype=string, numpy=array([[b'0', b'1']], dtype=object)>, 'all_class_ids': <tf.Tensor: shape=(1, 2), dtype=int32, numpy=array([[0, 1]], dtype=int32)>, 'logits': <tf.Tensor: shape=(1, 1), dtype=float32, numpy=array([[-1.1919093]], dtype=float32)>, 'logistic': <tf.Tensor: shape=(1, 1), dtype=float32, numpy=array([[0.23291764]], dtype=float32)>, 'probabilities': <tf.Tensor: shape=(1, 2), dtype=float32, numpy=array([[0.7670824 , 0.23291762]], dtype=float32)>}
tf.estimator.export.build_raw_serving_input_receiver_fn
ช่วยให้คุณสร้างฟังก์ชันอินพุตซึ่งรับเทนเซอร์แบบดิบมากกว่า tf.train.Example
s
ใช้ tf.distribute.Strategy
กับ Estimator (รองรับแบบจำกัด)
tf.estimator
เป็นการฝึกอบรม TensorFlow API แบบกระจายซึ่งเดิมสนับสนุนแนวทางเซิร์ฟเวอร์พารามิเตอร์ async tf.estimator
รองรับ tf.distribute.Strategy
แล้ว หากคุณกำลังใช้ tf.estimator
คุณสามารถเปลี่ยนเป็นการฝึกอบรมแบบกระจายโดยมีการเปลี่ยนแปลงเพียงเล็กน้อยในโค้ดของคุณ ด้วยวิธีนี้ ผู้ใช้ Estimator สามารถทำการฝึกอบรมแบบซิงโครนัสแบบกระจายบน GPU หลายตัวและพนักงานหลายคน รวมถึงใช้ TPU อย่างไรก็ตาม การสนับสนุนนี้ใน Estimator มีข้อจำกัด ตรวจสอบส่วน สิ่งที่ได้รับการสนับสนุนตอนนี้ ด้านล่างสำหรับรายละเอียดเพิ่มเติม
การใช้ tf.distribute.Strategy
กับ Estimator แตกต่างจากกรณีของ Keras เล็กน้อย แทนที่จะใช้ strategy.scope
ตอนนี้ คุณส่งอ็อบเจ็กต์ Strategy ไปที่ RunConfig
สำหรับ Estimator
คุณสามารถอ้างอิงถึง คู่มือการฝึกอบรมที่แจกจ่าย สำหรับข้อมูลเพิ่มเติม
นี่คือตัวอย่างโค้ดที่แสดงสิ่งนี้ด้วย Estimator LinearRegressor
และ MirroredStrategy
ที่สร้างไว้ล่วงหน้า:
mirrored_strategy = tf.distribute.MirroredStrategy()
config = tf.estimator.RunConfig(
train_distribute=mirrored_strategy, eval_distribute=mirrored_strategy)
regressor = tf.estimator.LinearRegressor(
feature_columns=[tf.feature_column.numeric_column('feats')],
optimizer='SGD',
config=config)
INFO:tensorflow:Using MirroredStrategy with devices ('/job:localhost/replica:0/task:0/device:GPU:0',) INFO:tensorflow:Using MirroredStrategy with devices ('/job:localhost/replica:0/task:0/device:GPU:0',) INFO:tensorflow:Initializing RunConfig with distribution strategies. INFO:tensorflow:Initializing RunConfig with distribution strategies. INFO:tensorflow:Not using Distribute Coordinator. INFO:tensorflow:Not using Distribute Coordinator. WARNING:tensorflow:Using temporary folder as model directory: /tmp/tmpftw63jyd WARNING:tensorflow:Using temporary folder as model directory: /tmp/tmpftw63jyd INFO:tensorflow:Using config: {'_model_dir': '/tmp/tmpftw63jyd', '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_steps': None, '_save_checkpoints_secs': 600, '_session_config': allow_soft_placement: true graph_options { rewrite_options { meta_optimizer_iterations: ONE } } , '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_log_step_count_steps': 100, '_train_distribute': <tensorflow.python.distribute.mirrored_strategy.MirroredStrategy object at 0x7f4b0c04c050>, '_device_fn': None, '_protocol': None, '_eval_distribute': <tensorflow.python.distribute.mirrored_strategy.MirroredStrategy object at 0x7f4b0c04c050>, '_experimental_distribute': None, '_experimental_max_worker_delay_secs': None, '_session_creation_timeout_secs': 7200, '_checkpoint_save_graph_def': True, '_service': None, '_cluster_spec': ClusterSpec({}), '_task_type': 'worker', '_task_id': 0, '_global_id_in_cluster': 0, '_master': '', '_evaluation_master': '', '_is_chief': True, '_num_ps_replicas': 0, '_num_worker_replicas': 1, '_distribute_coordinator_mode': None} INFO:tensorflow:Using config: {'_model_dir': '/tmp/tmpftw63jyd', '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_steps': None, '_save_checkpoints_secs': 600, '_session_config': allow_soft_placement: true graph_options { rewrite_options { meta_optimizer_iterations: ONE } } , '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_log_step_count_steps': 100, '_train_distribute': <tensorflow.python.distribute.mirrored_strategy.MirroredStrategy object at 0x7f4b0c04c050>, '_device_fn': None, '_protocol': None, '_eval_distribute': <tensorflow.python.distribute.mirrored_strategy.MirroredStrategy object at 0x7f4b0c04c050>, '_experimental_distribute': None, '_experimental_max_worker_delay_secs': None, '_session_creation_timeout_secs': 7200, '_checkpoint_save_graph_def': True, '_service': None, '_cluster_spec': ClusterSpec({}), '_task_type': 'worker', '_task_id': 0, '_global_id_in_cluster': 0, '_master': '', '_evaluation_master': '', '_is_chief': True, '_num_ps_replicas': 0, '_num_worker_replicas': 1, '_distribute_coordinator_mode': None}
ที่นี่ คุณใช้เครื่องมือประมาณการที่สร้างไว้ล่วงหน้า แต่โค้ดเดียวกันนี้ใช้ได้กับเครื่องมือประมาณการแบบกำหนดเองเช่นกัน train_distribute
กำหนดวิธีการแจกจ่ายการฝึกอบรม และ eval_distribute
กำหนดว่าจะแจกจ่ายการประเมินอย่างไร นี่เป็นอีกความแตกต่างจาก Keras ที่คุณใช้กลยุทธ์เดียวกันสำหรับทั้งการฝึกอบรมและการประเมิน
ตอนนี้คุณสามารถฝึกอบรมและประเมินเครื่องมือประมาณการนี้ด้วยฟังก์ชันอินพุต:
def input_fn():
dataset = tf.data.Dataset.from_tensors(({"feats":[1.]}, [1.]))
return dataset.repeat(1000).batch(10)
regressor.train(input_fn=input_fn, steps=10)
regressor.evaluate(input_fn=input_fn, steps=10)
INFO:tensorflow:Calling model_fn. /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/data/ops/dataset_ops.py:374: UserWarning: To make it possible to preserve tf.data options across serialization boundaries, their implementation has moved to be part of the TensorFlow graph. As a consequence, the options value is in general no longer known at graph construction time. Invoking this method in graph mode retains the legacy behavior of the original implementation, but note that the returned value might not reflect the actual value of the options. warnings.warn("To make it possible to preserve tf.data options across " INFO:tensorflow:Calling model_fn. INFO:tensorflow:Done calling model_fn. INFO:tensorflow:Done calling model_fn. INFO:tensorflow:Create CheckpointSaverHook. INFO:tensorflow:Create CheckpointSaverHook. WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow_estimator/python/estimator/util.py:95: DistributedIteratorV1.initialize (from tensorflow.python.distribute.input_lib) is deprecated and will be removed in a future version. Instructions for updating: Use the iterator's `initializer` property instead. WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow_estimator/python/estimator/util.py:95: DistributedIteratorV1.initialize (from tensorflow.python.distribute.input_lib) is deprecated and will be removed in a future version. Instructions for updating: Use the iterator's `initializer` property instead. INFO:tensorflow:Graph was finalized. INFO:tensorflow:Graph was finalized. INFO:tensorflow:Running local_init_op. INFO:tensorflow:Running local_init_op. INFO:tensorflow:Done running local_init_op. INFO:tensorflow:Done running local_init_op. INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 0... INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 0... INFO:tensorflow:Saving checkpoints for 0 into /tmp/tmpftw63jyd/model.ckpt. INFO:tensorflow:Saving checkpoints for 0 into /tmp/tmpftw63jyd/model.ckpt. INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 0... INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 0... 2021-09-22 20:49:45.706166: W tensorflow/core/grappler/utils/graph_view.cc:836] No registered 'MultiDeviceIteratorFromStringHandle' OpKernel for GPU devices compatible with node { {node MultiDeviceIteratorFromStringHandle} } . Registered: device='CPU' 2021-09-22 20:49:45.707521: W tensorflow/core/grappler/utils/graph_view.cc:836] No registered 'MultiDeviceIteratorGetNextFromShard' OpKernel for GPU devices compatible with node { {node MultiDeviceIteratorGetNextFromShard} } . Registered: device='CPU' INFO:tensorflow:loss = 1.0, step = 0 INFO:tensorflow:loss = 1.0, step = 0 INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 10... INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 10... INFO:tensorflow:Saving checkpoints for 10 into /tmp/tmpftw63jyd/model.ckpt. INFO:tensorflow:Saving checkpoints for 10 into /tmp/tmpftw63jyd/model.ckpt. INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 10... INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 10... INFO:tensorflow:Loss for final step: 2.877698e-13. INFO:tensorflow:Loss for final step: 2.877698e-13. INFO:tensorflow:Calling model_fn. INFO:tensorflow:Calling model_fn. INFO:tensorflow:Reduce to /replica:0/task:0/device:CPU:0 then broadcast to ('/replica:0/task:0/device:CPU:0',). INFO:tensorflow:Reduce to /replica:0/task:0/device:CPU:0 then broadcast to ('/replica:0/task:0/device:CPU:0',). INFO:tensorflow:Reduce to /replica:0/task:0/device:CPU:0 then broadcast to ('/replica:0/task:0/device:CPU:0',). INFO:tensorflow:Reduce to /replica:0/task:0/device:CPU:0 then broadcast to ('/replica:0/task:0/device:CPU:0',). INFO:tensorflow:Reduce to /replica:0/task:0/device:CPU:0 then broadcast to ('/replica:0/task:0/device:CPU:0',). INFO:tensorflow:Reduce to /replica:0/task:0/device:CPU:0 then broadcast to ('/replica:0/task:0/device:CPU:0',). INFO:tensorflow:Reduce to /replica:0/task:0/device:CPU:0 then broadcast to ('/replica:0/task:0/device:CPU:0',). INFO:tensorflow:Reduce to /replica:0/task:0/device:CPU:0 then broadcast to ('/replica:0/task:0/device:CPU:0',). INFO:tensorflow:Reduce to /replica:0/task:0/device:CPU:0 then broadcast to ('/replica:0/task:0/device:CPU:0',). INFO:tensorflow:Reduce to /replica:0/task:0/device:CPU:0 then broadcast to ('/replica:0/task:0/device:CPU:0',). INFO:tensorflow:Reduce to /replica:0/task:0/device:CPU:0 then broadcast to ('/replica:0/task:0/device:CPU:0',). INFO:tensorflow:Reduce to /replica:0/task:0/device:CPU:0 then broadcast to ('/replica:0/task:0/device:CPU:0',). INFO:tensorflow:Reduce to /replica:0/task:0/device:CPU:0 then broadcast to ('/replica:0/task:0/device:CPU:0',). INFO:tensorflow:Reduce to /replica:0/task:0/device:CPU:0 then broadcast to ('/replica:0/task:0/device:CPU:0',). INFO:tensorflow:Reduce to /replica:0/task:0/device:CPU:0 then broadcast to ('/replica:0/task:0/device:CPU:0',). INFO:tensorflow:Reduce to /replica:0/task:0/device:CPU:0 then broadcast to ('/replica:0/task:0/device:CPU:0',). INFO:tensorflow:Reduce to /replica:0/task:0/device:CPU:0 then broadcast to ('/replica:0/task:0/device:CPU:0',). INFO:tensorflow:Reduce to /replica:0/task:0/device:CPU:0 then broadcast to ('/replica:0/task:0/device:CPU:0',). INFO:tensorflow:Reduce to /replica:0/task:0/device:CPU:0 then broadcast to ('/replica:0/task:0/device:CPU:0',). INFO:tensorflow:Reduce to /replica:0/task:0/device:CPU:0 then broadcast to ('/replica:0/task:0/device:CPU:0',). INFO:tensorflow:Done calling model_fn. INFO:tensorflow:Done calling model_fn. INFO:tensorflow:Starting evaluation at 2021-09-22T20:49:46 INFO:tensorflow:Starting evaluation at 2021-09-22T20:49:46 INFO:tensorflow:Graph was finalized. INFO:tensorflow:Graph was finalized. INFO:tensorflow:Restoring parameters from /tmp/tmpftw63jyd/model.ckpt-10 INFO:tensorflow:Restoring parameters from /tmp/tmpftw63jyd/model.ckpt-10 INFO:tensorflow:Running local_init_op. INFO:tensorflow:Running local_init_op. INFO:tensorflow:Done running local_init_op. INFO:tensorflow:Done running local_init_op. 2021-09-22 20:49:46.680821: W tensorflow/core/grappler/utils/graph_view.cc:836] No registered 'MultiDeviceIteratorFromStringHandle' OpKernel for GPU devices compatible with node { {node MultiDeviceIteratorFromStringHandle} } . Registered: device='CPU' 2021-09-22 20:49:46.682161: W tensorflow/core/grappler/utils/graph_view.cc:836] No registered 'MultiDeviceIteratorGetNextFromShard' OpKernel for GPU devices compatible with node { {node MultiDeviceIteratorGetNextFromShard} } . Registered: device='CPU' INFO:tensorflow:Evaluation [1/10] INFO:tensorflow:Evaluation [1/10] INFO:tensorflow:Evaluation [2/10] INFO:tensorflow:Evaluation [2/10] INFO:tensorflow:Evaluation [3/10] INFO:tensorflow:Evaluation [3/10] INFO:tensorflow:Evaluation [4/10] INFO:tensorflow:Evaluation [4/10] INFO:tensorflow:Evaluation [5/10] INFO:tensorflow:Evaluation [5/10] INFO:tensorflow:Evaluation [6/10] INFO:tensorflow:Evaluation [6/10] INFO:tensorflow:Evaluation [7/10] INFO:tensorflow:Evaluation [7/10] INFO:tensorflow:Evaluation [8/10] INFO:tensorflow:Evaluation [8/10] INFO:tensorflow:Evaluation [9/10] INFO:tensorflow:Evaluation [9/10] INFO:tensorflow:Evaluation [10/10] INFO:tensorflow:Evaluation [10/10] INFO:tensorflow:Inference Time : 0.26514s INFO:tensorflow:Inference Time : 0.26514s INFO:tensorflow:Finished evaluation at 2021-09-22-20:49:46 INFO:tensorflow:Finished evaluation at 2021-09-22-20:49:46 INFO:tensorflow:Saving dict for global step 10: average_loss = 1.4210855e-14, global_step = 10, label/mean = 1.0, loss = 1.4210855e-14, prediction/mean = 0.99999994 INFO:tensorflow:Saving dict for global step 10: average_loss = 1.4210855e-14, global_step = 10, label/mean = 1.0, loss = 1.4210855e-14, prediction/mean = 0.99999994 INFO:tensorflow:Saving 'checkpoint_path' summary for global step 10: /tmp/tmpftw63jyd/model.ckpt-10 INFO:tensorflow:Saving 'checkpoint_path' summary for global step 10: /tmp/tmpftw63jyd/model.ckpt-10 {'average_loss': 1.4210855e-14, 'label/mean': 1.0, 'loss': 1.4210855e-14, 'prediction/mean': 0.99999994, 'global_step': 10}
ความแตกต่างอีกประการที่ควรเน้นที่นี่ระหว่าง Estimator และ Keras คือการจัดการอินพุต ใน Keras ชุดข้อมูลแต่ละชุดจะถูกแยกโดยอัตโนมัติในแบบจำลองหลายชุด อย่างไรก็ตาม ในเครื่องมือประมาณการ คุณไม่ได้ดำเนินการแยกชุดงานอัตโนมัติ หรือแบ่งข้อมูลโดยอัตโนมัติในผู้ปฏิบัติงานที่แตกต่างกัน คุณสามารถควบคุมได้อย่างเต็มที่ว่าต้องการให้ข้อมูลของคุณถูกแจกจ่ายไปยังผู้ปฏิบัติงานและอุปกรณ์อย่างไร และคุณต้องระบุ input_fn
เพื่อระบุวิธีการแจกจ่ายข้อมูลของคุณ
input_fn
ของคุณถูกเรียกหนึ่งครั้งต่อผู้ปฏิบัติงาน ดังนั้นจึงให้ชุดข้อมูลหนึ่งชุดต่อผู้ปฏิบัติงาน จากนั้นหนึ่งชุดงานจากชุดข้อมูลนั้นจะถูกป้อนไปยังแบบจำลองหนึ่งชุดบนตัวปฏิบัติงานนั้น ดังนั้นจึงใช้ชุดงาน N ชุดสำหรับแบบจำลอง N ตัวกับผู้ปฏิบัติงาน 1 คน กล่าวอีกนัยหนึ่ง ชุดข้อมูลที่ส่งคืนโดย input_fn
ควรจัดเตรียมชุดขนาด PER_REPLICA_BATCH_SIZE
และขนาดแบทช์โกลบอลสำหรับขั้นตอนสามารถรับได้เป็น PER_REPLICA_BATCH_SIZE * strategy.num_replicas_in_sync
เมื่อทำการฝึกอบรมผู้ปฏิบัติงานหลายคน คุณควรแบ่งข้อมูลของคุณให้กับผู้ปฏิบัติงาน หรือสับเปลี่ยนด้วยการสุ่มเมล็ดในแต่ละส่วน คุณสามารถตรวจสอบตัวอย่างวิธีการได้ในการ ฝึกอบรม Multi-worker with Estimator
และในทำนองเดียวกัน คุณสามารถใช้กลยุทธ์เซิร์ฟเวอร์แบบผู้ปฏิบัติงานหลายคนและพารามิเตอร์ได้เช่นกัน รหัสยังคงเหมือนเดิม แต่คุณต้องใช้ tf.estimator.train_and_evaluate
และตั้งค่าตัวแปรสภาพแวดล้อม TF_CONFIG
สำหรับแต่ละไบนารีที่ทำงานในคลัสเตอร์ของคุณ
ตอนนี้รองรับอะไรบ้าง?
มีการสนับสนุนอย่างจำกัดสำหรับการฝึกอบรมกับ Estimator โดยใช้กลยุทธ์ทั้งหมด ยกเว้น TPUStrategy
การฝึกอบรมและการประเมินขั้นพื้นฐานน่าจะใช้ได้ แต่ฟีเจอร์ขั้นสูงจำนวนหนึ่ง เช่น v1.train.Scaffold
ไม่สามารถทำได้ อาจมีบั๊กจำนวนหนึ่งในการผสานรวมนี้ และไม่มีแผนที่จะปรับปรุงการสนับสนุนนี้อย่างจริงจัง (เน้นที่ Keras และการสนับสนุนลูปการฝึกอบรมแบบกำหนดเอง) หากเป็นไปได้ คุณควรเลือกใช้ tf.distribute
กับ API เหล่านั้นแทน
การฝึกอบรม API | MirroredStrategy | TPUStrategy | MultiWorkerMirroredStrategy | CentralStorageStrategy | ParameterServerStrategy |
---|---|---|---|---|---|
เครื่องมือประมาณการ API | การสนับสนุนที่ จำกัด | ไม่รองรับ | การสนับสนุนที่ จำกัด | การสนับสนุนที่ จำกัด | การสนับสนุนที่ จำกัด |
ตัวอย่างและแบบฝึกหัด
ต่อไปนี้คือตัวอย่างบางส่วนจากต้นทางถึงปลายทางที่แสดงวิธีใช้กลยุทธ์ต่างๆ กับ Estimator:
- บทช่วยสอนการฝึกอบรมหลายคนพร้อมเครื่องมือประมาณการ แสดงให้เห็นว่าคุณสามารถฝึกอบรมกับพนักงานหลายคนโดยใช้
MultiWorkerMirroredStrategy
ในชุดข้อมูล MNIST ได้อย่างไร - ตัวอย่างแบบ end-to-end ของการ ดำเนินการฝึกอบรมผู้ปฏิบัติงานหลายคนด้วยกลยุทธ์การกระจาย ใน
tensorflow/ecosystem
โดยใช้เทมเพลต Kubernetes เริ่มต้นด้วยโมเดล Keras และแปลงเป็นตัวประมาณโดยใช้tf.keras.estimator.model_to_estimator
API - รุ่น ResNet50 อย่างเป็นทางการ ซึ่งสามารถฝึกได้โดยใช้
MirroredStrategy
หรือMultiWorkerMirroredStrategy