in lingvo/core/hyperparams.py [0:0]
def ToProto(self) -> hyperparams_pb2.Hyperparam:
"""Writes to a Hyperparams proto.
Serializes the Hyperparams into a proto that can be then written to disk or
sent over the network. Note that serialization is not guaranteed to be
unique or stable (this is a feature of protos themselves, not this code), so
using it for fingerprinting for example may not be appropriate. Refer to the
ToText() method for a serialization approach that Lingvo controls.
Returns:
The serialized params as a Hyperparams proto.
"""
def _ToParamValue(key: str, val: Any) -> hyperparams_pb2.HyperparamValue:
"""Serializes to HyperparamValue proto."""
param_pb = hyperparams_pb2.HyperparamValue()
if isinstance(val, Params):
param_pb.param_val.CopyFrom(_ToParam(val, prefix=key))
elif isinstance(val, list) or isinstance(val, range):
# The range function is serialized by explicitly calling it.
param_pb.list_val.items.extend(
[_ToParamValue(f'{key}[{i}]', v) for i, v in enumerate(val)])
elif isinstance(val, tuple):
param_pb.tuple_val.items.extend(
[_ToParamValue(f'{key}[{i}]', v) for i, v in enumerate(val)])
elif dataclasses.is_dataclass(val) or _IsNamedTuple(val):
val_cls = type(val)
items = val.__dict__.items() if dataclasses.is_dataclass(
val) else val._asdict().items()
param_pb.named_tuple_val.type = inspect.getmodule(
val_cls).__name__ + '/' + val_cls.__name__
param_pb.named_tuple_val.items.extend(
[_ToParamValue(f'{key}[{k}]', v) for k, v in items])
# Only dicts where all keys are str can be stored as dict_val.
elif isinstance(val, dict) and all(isinstance(k, str) for k in val):
param_pb.dict_val.SetInParent()
for k, v in val.items():
param_pb.dict_val.items[k].CopyFrom(_ToParamValue(f'{key}[{k}]', v))
elif isinstance(val, type):
param_pb.type_val = inspect.getmodule(val).__name__ + '/' + val.__name__
elif isinstance(val, tf.DType):
param_pb.dtype_val = val.name
elif isinstance(val, str):
param_pb.string_val = val
elif isinstance(val, bool):
param_pb.bool_val = val
elif isinstance(val, int):
param_pb.int_val = val
elif isinstance(val, float):
param_pb.float_val = val
elif isinstance(val, enum.Enum):
enum_cls = type(val)
param_pb.enum_val.type = inspect.getmodule(
enum_cls).__name__ + '/' + enum_cls.__name__
param_pb.enum_val.name = val.name
elif isinstance(val, message.Message):
proto_cls = type(val)
param_pb.proto_val.type = inspect.getmodule(
proto_cls).__name__ + '/' + proto_cls.__name__
param_pb.proto_val.val = val.SerializeToString()
elif symbolic.IsExpr(val):
param_pb.symbolic_val = pickle.dumps(val)
elif val is None:
# We represent a NoneType by the absence of any of the oneof.
pass
else:
param_pb.string_repr_val = repr(val)
return param_pb
def _ToParam(val: 'Params', prefix: str = '') -> hyperparams_pb2.Hyperparam:
"""Serializes to Hyperparam proto."""
param_pb = hyperparams_pb2.Hyperparam()
if prefix:
prefix += '.'
for k, v in val.IterParams():
param_pb.items[k].CopyFrom(_ToParamValue(prefix + k, v))
return param_pb
return _ToParam(self)