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