Menggunakan penyesuaian hyperparameter

Halaman ini menunjukkan cara menggunakan penyesuaian hyperparameter Pelatihan AI Platform saat melatih model Anda. Penyesuaian hyperparameter mengoptimalkan variabel target yang Anda tentukan. Variabel target disebut metrik hyperparameter. Saat memulai tugas dengan penyesuaian hyperparameter, Anda akan menetapkan nama metrik hyperparameter. Ini adalah nama yang Anda berikan pada ringkasan skalar yang Anda tambahkan ke pelatih.

Langkah-langkah yang diperlukan dalam penyesuaian hyperparameter

Untuk menggunakan penyesuaian hyperparameter dalam tugas pelatihan, Anda harus melakukan langkah-langkah berikut:

  1. Tentukan konfigurasi penyesuaian hyperparameter untuk tugas pelatihan Anda dengan menyertakan HyperparameterSpec dalam objek TrainingInput Anda.

  2. Sertakan kode berikut dalam aplikasi pelatihan Anda:

    • Mengurai argumen command line yang merepresentasikan hyperparameter yang ingin Anda sesuaikan, dan gunakan nilai tersebut untuk menetapkan hyperparameter untuk uji coba pelatihan Anda.
    • Tambahkan metrik hyperparameter ke ringkasan untuk grafik Anda.

Berikut detail selengkapnya dari setiap langkah.

Menentukan konfigurasi penyesuaian hyperparameter untuk tugas pelatihan Anda

Buat objek HyperparameterSpec untuk menyimpan konfigurasi penyesuaian hyperparameter untuk tugas pelatihan Anda, dan tambahkan HyperparameterSpec sebagai objek hyperparameters dalam objek TrainingInput Anda.

Tugas penyesuaian hyperparameter akan membuat tugas uji coba. Jika ingin mempercepat proses tugas uji coba pelatihan, Anda dapat menentukan jenis mesin kustom di objek TrainingInput. Misalnya, untuk membuat tugas uji coba dengan setiap tugas uji coba menggunakan VM n1-standard-8, Anda dapat menentukan masterType menjadi n1-standard-8 dan membiarkan konfigurasi pekerja kosong.

Di HyperparameterSpec, tetapkan hyperparameterMetricTag ke nilai yang mewakili metrik yang Anda pilih. Jika Anda tidak menentukan hyperparameterMetricTag, AI Platform Training akan mencari metrik dengan nama training/hptuning/metric. Contoh berikut menunjukkan cara membuat konfigurasi untuk metrik bernama metric1:

gcloud

Tambahkan informasi konfigurasi hyperparameter ke file YAML konfigurasi Anda. Berikut contohnya. Untuk file konfigurasi yang berfungsi, lihat hptuning_config.yaml dalam contoh estimator sensus.

trainingInput:
  scaleTier: CUSTOM
  masterType: complex_model_m
  workerType: complex_model_m
  parameterServerType: large_model
  workerCount: 9
  parameterServerCount: 3
  hyperparameters:
    goal: MAXIMIZE
    hyperparameterMetricTag: metric1
    maxTrials: 30
    maxParallelTrials: 1
    enableTrialEarlyStopping: True
    params:
    - parameterName: hidden1
      type: INTEGER
      minValue: 40
      maxValue: 400
      scaleType: UNIT_LINEAR_SCALE
    - parameterName: numRnnCells
      type: DISCRETE
      discreteValues:
      - 1
      - 2
      - 3
      - 4
    - parameterName: rnnCellType
      type: CATEGORICAL
      categoricalValues:
      - BasicLSTMCell
      - BasicRNNCell
      - GRUCell
      - LSTMCell
      - LayerNormBasicLSTMCell

Python

Buat kamus yang mewakili HyperparameterSpec Anda dan tambahkan ke input pelatihan. Contoh berikut mengasumsikan bahwa Anda telah membuat kamus TrainingInput (dalam hal ini bernama training_inputs) seperti yang ditunjukkan dalam panduan konfigurasi tugas pelatihan.

# Add hyperparameter tuning to the job config.
hyperparams = {
    'goal': 'MAXIMIZE',
    'hyperparameterMetricTag': 'metric1',
    'maxTrials': 30,
    'maxParallelTrials': 1,
    'enableTrialEarlyStopping': True,
    'params': []}

hyperparams['params'].append({
    'parameterName':'hidden1',
    'type':'INTEGER',
    'minValue': 40,
    'maxValue': 400,
    'scaleType': 'UNIT_LINEAR_SCALE'})

hyperparams['params'].append({
    'parameterName':'numRnnCells',
    'type':'DISCRETE',
    'discreteValues': [1, 2, 3, 4]})

hyperparams['params'].append({
    'parameterName':'rnnCellType',
    'type': 'CATEGORICAL',
    'categoricalValues': [
        'BasicLSTMCell',
        'BasicRNNCell',
        'GRUCell',
        'LSTMCell',
        'LayerNormBasicLSTMCell'
    ]
})

# Add hyperparameter specification to the training inputs dictionary.
training_inputs['hyperparameters'] = hyperparams

# Build the job spec.
job_spec = {'jobId': my_job_name, 'trainingInput': training_inputs}

Memeriksa kode di aplikasi pelatihan

Dalam aplikasi Anda, tangani argumen command line untuk hyperparameter dan laporkan metrik hyperparameter Anda ke Pelatihan AI Platform.

Menangani argumen command line untuk hyperparameter yang ingin Anda sesuaikan

AI Platform Training menetapkan argumen command line saat memanggil aplikasi pelatihan Anda. Gunakan argumen command line dalam kode Anda:

  1. Tentukan nama untuk setiap argumen hyperparameter dan uraikan menggunakan parser argumen apa pun yang Anda inginkan (biasanya argparse). Nama argumen harus cocok dengan nama parameter yang Anda tentukan dalam konfigurasi tugas, seperti dijelaskan di atas.

  2. Tetapkan nilai dari argumen command line ke hyperparameter dalam kode pelatihan Anda.

Melaporkan metrik hyperparameter Anda ke Pelatihan AI Platform

Cara melaporkan metrik hyperparameter ke layanan Pelatihan AI Platform bergantung pada apakah Anda menggunakan TensorFlow untuk pelatihan atau tidak. Hal ini juga bergantung pada apakah Anda menggunakan versi runtime atau penampung kustom untuk pelatihan.

Sebaiknya kode pelatihan Anda melaporkan metrik hyperparameter Anda ke Pelatihan AI Platform secara rutin untuk memanfaatkan perhentian awal.

TensorFlow dengan versi runtime

Jika menggunakan versi runtime Pelatihan AI Platform dan berlatih dengan TensorFlow, Anda dapat melaporkan metrik hyperparameter ke Pelatihan AI Platform dengan menulis metrik ke ringkasan TensorFlow. Gunakan salah satu fungsi berikut:

Menggunakan TensorFlow API berbeda yang memanggil salah satu fungsi sebelumnya, seperti dalam contoh Estimator berikut, juga melaporkan metrik hyperparameter ke Pelatihan AI Platform.

Contoh berikut menunjukkan dasar-dasar dua cara berbeda untuk menulis metrik hyperparameter Anda ke sebuah ringkasan. Kedua contoh ini mengasumsikan bahwa Anda melatih model regresi, dan menulis error akar rata-rata kuadrat antara label kebenaran dasar dan prediksi evaluasi sebagai metrik hyperparameter yang bernama metric1.

Keras

Contoh berikut menggunakan callback Keras kustom untuk menulis ringkasan skalar di akhir setiap epoch pelatihan:

class MyMetricCallback(tf.keras.callbacks.Callback):

    def on_epoch_end(self, epoch, logs=None):
        tf.summary.scalar('metric1', logs['RootMeanSquaredError'], epoch)

logdir = "logs/scalars/" + datetime.now().strftime("%Y%m%d-%H%M%S")
file_writer = tf.summary.create_file_writer(logdir + "/metrics")
file_writer.set_as_default()

model = tf.keras.Sequential(
    tf.keras.layers.Dense(1, activation='linear', input_dim=784))
model.compile(
    optimizer='rmsprop',
    loss='mean_squared_error',
    metrics=['RootMeanSquaredError'])

model.fit(
    x_train,
    y_train,
    batch_size=64,
    epochs=10,
    steps_per_epoch=5,
    verbose=0,
    callbacks=[MyMetricCallback()])

Estimator

Contoh berikut menggunakan tf.estimator.add_metrics untuk menambahkan metrik hyperparameter ke ringkasan untuk grafik Anda.

Perhatikan bahwa Estimator menulis ringkasan grafik setiap kali metode evaluate berjalan. Contoh ini menggunakan tf.estimator.EvalSpec dengan tf.estimator.train_and_evaluate untuk mengonfigurasi estimator agar mengevaluasi dan menulis ringkasan setiap 300 detik selama pelatihan.

# Create metric for hyperparameter tuning
def my_metric(labels, predictions):
    # Note that different types of estimator provide different different
    # keys on the predictions Tensor. predictions['predictions'] is for
    # regression output.
    pred_values = predictions['predictions']
    return {'metric1': tf.compat.v1.metrics.root_mean_squared_error(labels, pred_values)}

# Create estimator to train and evaluate
def train_and_evaluate(output_dir):

    estimator = tf.estimator.DNNLinearCombinedRegressor(...)

    estimator = tf.estimator.add_metrics(estimator, my_metric)

    train_spec = ...
    eval_spec = tf.estimator.EvalSpec(
        start_delay_secs = 60, # start evaluating after 60 seconds
        throttle_secs = 300,  # evaluate every 300 seconds
        ...)
    tf.estimator.train_and_evaluate(estimator, train_spec, eval_spec)

Framework machine learning atau container kustom lainnya

Jika Anda menggunakan penampung kustom untuk pelatihan atau jika ingin melakukan penyesuaian hyperparameter dengan framework selain TensorFlow, Anda harus menggunakan paket Python cloudml-hypertune untuk melaporkan metrik hyperparameter ke Pelatihan AI Platform.

Lihat contoh penggunaan cloudml-hypertune.

Mendapatkan detail tugas penyesuaian hyperparameter saat berjalan

Anda dapat memantau penyesuaian hyperparameter dengan mendapatkan status mendetail dari tugas pelatihan yang sedang berjalan.

Objek TrainingOutput dalam resource Tugas respons memiliki nilai berikut yang ditetapkan selama tugas pelatihan dengan penyesuaian hyperparameter:

  • isHyperparameterTuningJob disetel ke True.

  • trials ada dan berisi daftar objek HyperparameterOutput, satu per uji coba.

Anda juga dapat mengambil ID uji coba dari variabel lingkungan TF_CONFIG. Lihat panduan untuk mendapatkan detail dari TF_CONFIG.

Mendapatkan hasil penyesuaian hyperparameter

Setelah pelatihan selesai, Anda dapat melihat hasil setiap uji coba di Konsol Google Cloud. Atau, Anda dapat memanggil projects.jobs.get untuk mendapatkan hasilnya. Objek TrainingOutput dalam resource tugas berisi metrik untuk semua eksekusi, dengan metrik untuk urutan terbaik yang diidentifikasi.

Gunakan permintaan status mendetail yang sama seperti yang Anda gunakan untuk memantau tugas selama pemrosesan untuk mendapatkan informasi ini.

Anda dapat melihat hasil dari setiap uji coba di deskripsi pekerjaan. Di Konsol Google Cloud, Anda dapat memfilter uji coba menurut rmse, learning_rate, dan training steps. Temukan uji coba yang menghasilkan nilai yang paling diinginkan untuk metrik hyperparameter Anda. Jika uji coba memenuhi standar keberhasilan model, Anda dapat menggunakan nilai hyperparameter yang ditampilkan untuk uji coba tersebut pada proses selanjutnya dari model Anda.

Terkadang beberapa uji coba memberikan hasil yang sama untuk metrik penyesuaian Anda. Dalam kasus tersebut, Anda harus menentukan nilai hyperparameter mana yang paling menguntungkan oleh ukuran lain. Misalnya, jika Anda menyesuaikan jumlah node dalam lapisan tersembunyi dan mendapatkan hasil yang sama saat nilainya disetel ke 8 seperti saat disetel ke 20, Anda harus menggunakan 8, karena lebih banyak node berarti lebih banyak pemrosesan dan biaya tanpa peningkatan pada model Anda.

Status uji coba FAILED di HyperparameterOutput dapat berarti bahwa pelatihan gagal untuk uji coba tersebut, atau uji coba gagal melaporkan metrik penyesuaian hyperparameter. Dalam kasus terakhir, tugas induk dapat berhasil meskipun uji coba gagal. Anda dapat melihat log uji coba untuk mengetahui apakah pelatihan gagal untuk uji coba.

Menetapkan batas jumlah uji coba

Anda harus menentukan jumlah uji coba yang diizinkan untuk menjalankan layanan dan menetapkan nilai maxTrials dalam objek HyperparameterSpec.

Ada dua minat yang bersaing untuk dipertimbangkan saat memutuskan jumlah uji coba yang diizinkan:

  • waktu (dan akibatnya)
  • akurasi

Peningkatan jumlah uji coba umumnya memberikan hasil yang lebih baik, tetapi tidak selalu demikian. Dalam sebagian besar kasus, ada titik penurunan hasil, yang mana uji coba tambahan memiliki sedikit atau tidak berpengaruh pada akurasi. Sebaiknya mulai dengan sedikit uji coba untuk mengukur efek hyperparameter yang dipilih terhadap akurasi model Anda sebelum memulai tugas dengan uji coba dalam jumlah besar.

Untuk mendapatkan hasil maksimal dari penyesuaian hyperparameter, Anda tidak boleh menetapkan nilai maksimum lebih rendah dari sepuluh kali jumlah hyperparameter yang digunakan.

Menangani uji coba yang gagal

Jika uji coba penyesuaian hyperparameter Anda keluar dengan error, Anda mungkin ingin mengakhiri tugas pelatihan lebih awal. Tetapkan kolom maxFailedTrials di HyperparameterSpec ke jumlah uji coba gagal yang ingin Anda izinkan. Setelah jumlah uji coba ini gagal, AI Platform Training mengakhiri tugas pelatihan. Nilai maxFailedTrials harus kurang dari atau sama dengan maxTrials.

Jika maxFailedTrials tidak ditetapkan, atau jika Anda menyetelnya ke 0, AI Platform Training akan menggunakan aturan berikut untuk menangani uji coba yang gagal:

  • Jika uji coba pertama tugas Anda gagal, Pelatihan AI Platform akan langsung mengakhiri tugas. Kegagalan selama uji coba pertama menunjukkan adanya masalah pada kode pelatihan Anda, sehingga uji coba berikutnya juga mungkin akan gagal. Mengakhiri tugas memberi Anda kesempatan untuk mendiagnosis masalah tanpa menunggu lebih banyak uji coba dan menimbulkan biaya yang lebih besar.
  • Jika uji coba pertama berhasil, Pelatihan AI Platform dapat mengakhiri tugas setelah gagal selama uji coba berikutnya berdasarkan salah satu kriteria berikut:
    • Jumlah uji coba yang gagal bertambah terlalu tinggi.
    • Rasio uji coba yang gagal terhadap uji coba yang berhasil meningkat terlalu tinggi.

Batas internal ini dapat berubah sewaktu-waktu. Untuk memastikan perilaku tertentu, tetapkan kolom maxFailedTrials.

Menjalankan uji coba paralel

Anda dapat menentukan jumlah uji coba yang akan dijalankan secara paralel dengan menetapkan maxParallelTrials dalam objek HyperparameterSpec.

Menjalankan uji coba paralel memiliki manfaat mengurangi waktu yang dibutuhkan tugas pelatihan (real time—total waktu pemrosesan yang diperlukan biasanya tidak berubah). Namun, menjalankan tugas secara paralel dapat mengurangi efektivitas tugas penyesuaian secara keseluruhan. Hal ini karena penyesuaian hyperparameter menggunakan hasil uji coba sebelumnya untuk menginformasikan nilai yang akan ditetapkan ke hyperparameter dari uji coba berikutnya. Saat berjalan secara paralel, beberapa uji coba dimulai tanpa mendapatkan manfaat dari hasil uji coba yang masih berjalan.

Jika Anda menggunakan uji coba paralel, layanan pelatihan akan menyediakan beberapa cluster pemrosesan pelatihan (atau beberapa mesin individu untuk pelatih proses tunggal). Tingkat skala yang Anda tetapkan untuk tugas Anda digunakan untuk setiap cluster pelatihan.

Menghentikan uji coba lebih awal

Anda dapat menentukan bahwa Pelatihan AI Platform harus otomatis menghentikan uji coba yang jelas-jelas tidak menjanjikan. Hal ini menghemat biaya untuk melanjutkan uji coba yang kemungkinan tidak akan berguna.

Untuk mengizinkan penghentian uji coba lebih awal, tetapkan nilai enableTrialEarlyStopping di HyperparameterSpec ke TRUE.

Melanjutkan tugas penyesuaian hyperparameter yang telah selesai

Anda dapat melanjutkan tugas penyesuaian hyperparameter yang telah selesai, untuk memulai dari status yang dioptimalkan sebagian. Hal ini memungkinkan penggunaan kembali pengetahuan yang diperoleh dalam tugas penyesuaian hyperparameter sebelumnya.

Untuk melanjutkan tugas penyesuaian hyperparameter, kirimkan tugas penyesuaian hyperparameter baru dengan konfigurasi berikut:

  • Tetapkan nilai resumePreviousJobId di HyperparameterSpec ke ID tugas dari uji coba sebelumnya.
  • Menentukan nilai untuk maxTrials dan maxParallelTrials.

Pelatihan AI Platform menggunakan ID tugas sebelumnya untuk menemukan dan menggunakan kembali nilai goal, params, dan hyperparameterMetricTag yang sama untuk melanjutkan tugas penyesuaian hyperparameter.

Gunakan nama hyperparameterMetricTag dan params yang konsisten untuk tugas serupa, meskipun tugas memiliki parameter yang berbeda. Praktik ini memungkinkan Pelatihan AI Platform meningkatkan pengoptimalan dari waktu ke waktu.

Contoh berikut menunjukkan penggunaan konfigurasi resumePreviousJobId:

gcloud

trainingInput:
  scaleTier: CUSTOM
  masterType: complex_model_m
  workerType: complex_model_m
  parameterServerType: large_model
  workerCount: 9
  parameterServerCount: 3
  hyperparameters:
    enableTrialEarlyStopping: TRUE
    maxTrials: 30
    maxParallelTrials: 1
    resumePreviousJobId: [PREVIOUS_JOB_IDENTIFIER]

Python

# Add hyperparameter tuning to the job config.
hyperparams = {
    'enableTrialEarlyStopping': True,
    'maxTrials': 30,
    'maxParallelTrials': 1,
    'resumePreviousJobId': [PREVIOUS_JOB_IDENTIFIER]}

# Add the hyperparameter specification to the training inputs dictionary.
training_inputs['hyperparameters'] = hyperparams

# Build the job spec.
job_spec = {'jobId': my_job_name, 'trainingInput': training_inputs}

Penyesuaian hyperparameter dengan Cloud TPU

Jika Anda menjalankan tugas penyesuaian hyperparameter dengan Cloud TPU di Pelatihan AI Platform, praktik terbaiknya adalah menggunakan properti eval_metrics di TPUEstimatorSpec.

Lihat contoh penyesuaian hyperparameter ResNet-50 TPU untuk contoh kerja penyesuaian hyperparameter dengan Cloud TPU.

Sebagai ganti penggunaan properti eval_metrics untuk menggunakan layanan penyesuaian hyperparameter, Anda dapat menggunakan alternatifnya dengan memanggil tf.summary di host_call. Untuk mengetahui detailnya, lihat TPUEstimatorSpec.

Langkah selanjutnya