synchronized
函数keras_tuner.synchronized(func, )
用于同步对 Oracle
函数的多线程调用的装饰器。
在并行调优中,可能会有来自多个线程的 gRPC 调用并发访问 Oracle
方法,例如 create_trial()
、update_trial()
和 end_trial()
。为了避免数据被并发写入,请使用 @synchronized
来确保调用是同步的,这样每次只允许一个调用运行。
对不同 Oracle
对象的并发调用不会相互阻塞。对同一 Oracle
对象的相同或不同函数的并发调用会相互阻塞。
你可以装饰一个子类函数,该函数覆盖了基类中已被装饰的函数,而无需担心产生死锁。然而,该装饰器只支持类内部的方法,不能应用于独立的函数。
你无需装饰 Oracle.populate_space()
,因为它只会被已被装饰的 Oracle.create_trial()
调用。
示例
class MyOracle(keras_tuner.Oracle):
@keras_tuner.synchronized
def create_trial(self, tuner_id):
super().create_trial(tuner_id)
...
@keras_tuner.synchronized
def update_trial(self, trial_id, metrics, step=0):
super().update_trial(trial_id, metrics, step)
...
@keras_tuner.synchronized
def end_trial(self, trial):
super().end_trial(trial)
...