Skip to content

Commit 92df64f

Browse files
Wang Zhoufacebook-github-bot
authored andcommitted
Add method to update internal hyperparameters for FBGEMM TBE (#3025)
Summary: X-link: facebookresearch/FBGEMM#120 Pull Request resolved: #3025 D61634495 would allow to use a hyperparameter schedule to change the hyperparameter values during training (just like learning rate schedule). In order to do so, we define a method `update_hyper_parameters` to update the internal parameter values. Reviewed By: minddrummer Differential Revision: D61642016
1 parent 225ac16 commit 92df64f

2 files changed

Lines changed: 81 additions & 0 deletions

File tree

fbgemm_gpu/fbgemm_gpu/split_table_batched_embeddings_ops_training.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2209,6 +2209,33 @@ def set_learning_rate(self, lr: float) -> None:
22092209
)
22102210
self._set_learning_rate(lr)
22112211

2212+
@torch.jit.ignore
2213+
def update_hyper_parameters(self, params_dict: Dict[str, float]) -> None:
2214+
"""
2215+
Sets hyper-parameters from external control flow.
2216+
"""
2217+
if self.optimizer == OptimType.NONE:
2218+
raise NotImplementedError(
2219+
f"Setting learning rate is not supported for {self.optimizer}"
2220+
)
2221+
for parameter_name, value in params_dict.items():
2222+
if parameter_name == "lr":
2223+
self._set_learning_rate(value)
2224+
elif parameter_name == "eps":
2225+
self.optimizer_args = self.optimizer_args._replace(eps=value)
2226+
elif parameter_name == "beta1":
2227+
self.optimizer_args = self.optimizer_args._replace(beta1=value)
2228+
elif parameter_name == "beta2":
2229+
self.optimizer_args = self.optimizer_args._replace(beta2=value)
2230+
elif parameter_name == "weight_decay":
2231+
self.optimizer_args = self.optimizer_args._replace(weight_decay=value)
2232+
elif parameter_name == "lower_bound":
2233+
self.gwd_lower_bound = value
2234+
else:
2235+
raise NotImplementedError(
2236+
f"Setting hyper-parameter {parameter_name} is not supported"
2237+
)
2238+
22122239
@torch.jit.ignore
22132240
def _set_learning_rate(self, lr: float) -> float:
22142241
"""

fbgemm_gpu/test/tbe/utils/split_embeddings_test.py

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -559,6 +559,60 @@ def check_weight_momentum(v: int) -> None:
559559

560560
check_weight_momentum(0)
561561

562+
@unittest.skipIf(*gpu_unavailable)
563+
@settings(verbosity=VERBOSITY, max_examples=MAX_EXAMPLES, deadline=None)
564+
def test_update_hyper_parameters(self) -> None:
565+
# Create an abstract split table
566+
D = 8
567+
T = 2
568+
E = 10**2
569+
Ds = [D] * T
570+
Es = [E] * T
571+
572+
hyperparameters = {
573+
"eps": 0.1,
574+
"beta1": 0.9,
575+
"beta2": 0.999,
576+
"weight_decay": 0.0,
577+
}
578+
cc = SplitTableBatchedEmbeddingBagsCodegen(
579+
embedding_specs=[
580+
(
581+
E,
582+
D,
583+
EmbeddingLocation.DEVICE,
584+
ComputeDevice.CUDA,
585+
)
586+
for (E, D) in zip(Es, Ds)
587+
],
588+
learning_rate=0.1,
589+
**hyperparameters, # pyre-ignore[6]
590+
)
591+
592+
# Update hyperparameters
593+
updated_parameters = {
594+
key: value + 1.0 for key, value in hyperparameters.items()
595+
} | {"lr": 1.0, "lower_bound": 2.0}
596+
cc.update_hyper_parameters(updated_parameters)
597+
self.assertAlmostEqual(
598+
cc.optimizer_args.learning_rate, updated_parameters["lr"]
599+
)
600+
self.assertAlmostEqual(cc.optimizer_args.eps, updated_parameters["eps"])
601+
self.assertAlmostEqual(cc.optimizer_args.beta1, updated_parameters["beta1"])
602+
self.assertAlmostEqual(cc.optimizer_args.beta2, updated_parameters["beta2"])
603+
self.assertAlmostEqual(
604+
cc.optimizer_args.weight_decay, updated_parameters["weight_decay"]
605+
)
606+
self.assertAlmostEqual(cc.gwd_lower_bound, updated_parameters["lower_bound"])
607+
608+
# Update hyperparameters with invalid parameter name
609+
invalid_parameter = "invalid_parameter"
610+
with self.assertRaisesRegex(
611+
NotImplementedError,
612+
f"Setting hyper-parameter {invalid_parameter} is not supported",
613+
):
614+
cc.update_hyper_parameters({"invalid_parameter": 1.0})
615+
562616

563617
if __name__ == "__main__":
564618
unittest.main()

0 commit comments

Comments
 (0)