Menggunakan penyesuaian hyperparameter

Halaman ini menunjukkan cara menggunakan penyesuaian hyperparameter Pelatihan AI Platform saat melatih model. 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 tetapkan ke ringkasan skalar yang Anda tambahkan ke pelatih.

Langkah-langkah yang terlibat dalam penyesuaian hyperparameter

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

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

  2. Sertakan kode berikut dalam aplikasi pelatihan Anda:

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

Berikut detail selengkapnya tentang setiap langkah.

Menentukan konfigurasi penyesuaian hyperparameter untuk tugas pelatihan

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

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. 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 dan tambahkan ke input pelatihan Anda. 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 AI Platform Training.

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 yang dijelaskan di atas.

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

Melaporkan metrik hyperparameter ke AI Platform Training

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

Sebaiknya kode pelatihan Anda melaporkan metrik hyperparameter ke Pelatihan AI Platform secara rutin untuk memanfaatkan penghentian 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 yang berbeda yang memanggil salah satu fungsi sebelumnya, seperti dalam contoh Estimator berikut, juga melaporkan metrik hyperparameter ke Pelatihan Platform AI.

Contoh berikut menunjukkan dasar-dasar dua cara berbeda untuk menulis metrik hyperparameter ke ringkasan. Kedua contoh tersebut mengasumsikan bahwa Anda melatih model regresi, dan keduanya menulis root-mean-square-error antara label kebenaran nyata dan prediksi evaluasi sebagai metrik hyperparameter 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 guna 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 Anda ingin melakukan penyesuaian hyperparameter dengan framework selain TensorFlow, Anda harus menggunakan paket Python cloudml-hypertune untuk melaporkan metrik hyperparameter ke AI Platform Training.

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 percobaan.

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 dijalankan, Anda dapat melihat hasil setiap uji coba di konsol Google Cloud. Atau, Anda dapat memanggil projects.jobs.get untuk mendapatkan hasilnya. Objek TrainingOutput di resource tugas berisi metrik untuk semua operasi, dengan metrik untuk operasi yang disesuaikan terbaik 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 tugas. 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 dalam eksekusi model berikutnya.

Terkadang beberapa uji coba memberikan hasil yang identik untuk metrik penyesuaian Anda. Dalam kasus tersebut, Anda harus menentukan nilai hyperparameter mana yang paling menguntungkan berdasarkan ukuran lain. Misalnya, jika Anda menyesuaikan jumlah node di lapisan tersembunyi dan mendapatkan hasil yang identik saat nilai disetel ke 8 seperti saat disetel ke 20, Anda harus menggunakan 8, karena semakin banyak node berarti semakin 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 bahwa 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 melihat apakah pelatihan gagal untuk uji coba.

Menetapkan batas jumlah uji coba

Anda harus menentukan jumlah uji coba yang ingin Anda izinkan untuk menjalankan layanan, dan tetapkan nilai maxTrials dalam objek HyperparameterSpec.

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

  • waktu (dan akibatnya biaya)
  • akurasi

Meningkatkan jumlah uji coba umumnya memberikan hasil yang lebih baik, tetapi tidak selalu demikian. Dalam sebagian besar kasus, ada titik penurunan laba, yang setelahnya uji coba tambahan memiliki sedikit atau tidak berpengaruh pada akurasi. Sebaiknya mulai dengan sedikit uji coba untuk mengukur efek hyperparameter yang Anda pilih terhadap akurasi model sebelum memulai tugas dengan jumlah uji coba yang 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 akan mengakhiri tugas pelatihan. Nilai maxFailedTrials harus kurang dari atau sama dengan maxTrials.

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

  • Jika uji coba pertama tugas Anda gagal, AI Platform Training akan langsung mengakhiri tugas Anda. Kegagalan selama uji coba pertama menunjukkan adanya masalah pada kode pelatihan Anda, sehingga uji coba berikutnya juga mungkin akan gagal. Dengan mengakhiri tugas, Anda dapat mendiagnosis masalah tanpa menunggu uji coba lebih banyak dan menimbulkan biaya yang lebih besar.
  • Jika uji coba pertama berhasil, Pelatihan AI Platform mungkin akan 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.

Nilai minimum 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 di 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 individual untuk pelatih proses tunggal). Tingkat skala yang Anda tetapkan untuk tugas digunakan untuk setiap cluster pelatihan.

Menghentikan uji coba lebih awal

Anda dapat menentukan bahwa Pelatihan AI Platform harus otomatis menghentikan uji coba yang jelas tidak akan memberikan hasil yang baik. 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, kirim tugas penyesuaian hyperparameter baru dengan konfigurasi berikut:

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

AI Platform Training 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 yang 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 TPU ResNet-50 untuk contoh penerapan penyesuaian hyperparameter dengan Cloud TPU.

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

Langkah selanjutnya