tf.keras.distribution.ModelParallel
Распределение, которое фрагментирует переменные модели.
tf.keras.distribution.ModelParallel(
device_mesh, layout_map, batch_dim_name=None
)
Сравните с DataParallel, которое дублирует переменные по всем устройствам, ModelParallel позволяет фрагментировать переменные помимо входных данных.
Чтобы создать распределение ModelParallel, вам нужно предоставить DeviceMesh и LayoutMap.
-
DeviceMeshсодержит информацию о физических устройствах. Имена осей в сетке будут использоваться для сопоставления макета переменных и данных. -
LayoutMapсодержит отображение путей переменных к соответствующимTensorLayout.
Пример:
devices = list_devices() # Assume there are 8 devices.
# Create a mesh with 2 devices for data parallelism and 4 devices for
# model parallelism.
device_mesh = DeviceMesh(shape=(2, 4), axis_names=('batch', 'model'),
devices=devices)
# Create a layout map that shard the `Dense` layer and `Conv2D`
# layer variables on the last dimension.
# Based on the `device_mesh`, this means the variables
# will be split across 4 devices. Any other variable that doesn't
# match any key in the layout map will be fully replicated.
layout_map = LayoutMap(device_mesh)
layout_map['dense.*kernel'] = (None, 'model')
layout_map['dense.*bias'] = ('model',)
layout_map['conv2d.*kernel'] = (None, None, None, 'model')
layout_map['conv2d.*bias'] = ('model',)
distribution = ModelParallel(device_mesh=device_mesh,
layout_map=layout_map,
batch_dim_name='batch')
# Set the global distribution, or via `with distribution.scope():`
set_distribution(distribution)
model = model_creation()
model.compile()
model.fit(data)
Вы можете быстро обновить форму сетки устройств, чтобы изменить коэффициент фрагментации переменных. Например:
# With only the shape change for the device mesh, the variables will be
# sharded across 8 devices instead of 4, which further reduces the memory
# footprint of variables on each of the device.
device_mesh = DeviceMesh(shape=(1, 8), axis_names=('batch', 'model'),
devices=devices)
Чтобы определить правильное правило сопоставления макета для всех переменных модели, вы можете сначала перечислить все пути переменных модели, которые будут использоваться в качестве ключа для сопоставления переменных с TensorLayout.
Например:
model = create_model()
for v in model.variables:
print(v.path)
| Аргументы | |
|---|---|
device_mesh | экземпляр DeviceMesh для физического устройства и его логического отображения. |
layout_map | экземпляр LayoutMap, который сопоставляет путь переменной с соответствующим TensorLayout. Имена осей TensorLayout должны совпадать с именами осей в device_mesh, в противном случае будет выброшено исключение. |
batch_dim_name | необязательная строка, имя оси в device_mesh, которое будет использоваться для распределения данных. Если не указано, будет использоваться первая ось из device_mesh. |
| Атрибуты | |
|---|---|
device_mesh | |
Методы
distribute_dataset
distribute_dataset(
dataset
)
Создайте экземпляр распределенного набора данных из исходного пользовательского набора данных.
| Аргументы | |
|---|---|
dataset | исходный глобальный экземпляр набора данных. В настоящий момент поддерживается только tf.data.Dataset. |
| Возвращаемое значение | |
|---|---|
экземпляр фрагментированного tf.data.Dataset, который будет генерировать данные для текущего локального работника/процесса. |
get_data_layout
get_data_layout(
data_shape
)
Получить TensorLayout для входных данных.
| Аргументы | |
|---|---|
data_shape | форма входных данных в формате списка или кортежа. |
| Возвращаемое значение | |
|---|---|
TensorLayout для данных, которые могут использоваться backend.distribute_value() для перераспределения входных данных. |
get_tensor_layout
get_tensor_layout(
path
)
Получить TensorLayout для промежуточного тензора.
| Аргументы | |
|---|---|
path | строковый путь к соответствующему тензору. |
возвращает: TensorLayout для промежуточного тензора, который может использоваться backend.relayout() для перераспределения тензора. Может также вернуть None.
get_variable_layout
get_variable_layout(
variable
)
Получить TensorLayout для переменной.
| Аргументы | |
|---|---|
variable | экземпляр KerasVariable. |
возвращает: TensorLayout для переменной, который может использоваться backend.distribute_value() для перераспределения переменной.
scope
@contextlib.contextmanager scope()
Блок кода для установки текущего Distribution.
© 2022 The TensorFlow Authors. All rights reserved.
Licensed under the Creative Commons Attribution License 4.0.
Code samples licensed under the Apache 2.0 License.
https://www.tensorflow.org/api_docs/python/tf/keras/distribution/ModelParallel