Files
2026-07-13 12:40:42 +08:00

1202 lines
45 KiB
Python

# Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import os
import pickle
import tempfile
import unittest
import numpy as np
from op_test import get_device_place, is_custom_device
from test_imperative_base import new_program_scope
import paddle
from paddle import base
from paddle.base import core, framework
from paddle.framework import in_pir_mode
from paddle.optimizer import Adam
paddle.enable_static()
class SimpleLSTMRNN(paddle.nn.Layer):
def __init__(
self,
name_scope,
hidden_size,
num_steps,
num_layers=2,
init_scale=0.1,
dropout=None,
):
super().__init__()
self._hidden_size = hidden_size
self._num_layers = num_layers
self._init_scale = init_scale
self._dropout = dropout
self._input = None
self._num_steps = num_steps
self.cell_array = []
self.hidden_array = []
self.weight_1_arr = []
self.weight_2_arr = []
self.bias_arr = []
self.mask_array = []
for i in range(self._num_layers):
weight_1 = self.create_parameter(
attr=base.ParamAttr(
initializer=paddle.nn.initializer.Uniform(
low=-self._init_scale, high=self._init_scale
)
),
shape=[self._hidden_size * 2, self._hidden_size * 4],
dtype="float32",
default_initializer=paddle.nn.initializer.Uniform(
low=-self._init_scale, high=self._init_scale
),
)
self.weight_1_arr.append(self.add_parameter(f'w_{i}', weight_1))
bias_1 = self.create_parameter(
attr=base.ParamAttr(
initializer=paddle.nn.initializer.Uniform(
low=-self._init_scale, high=self._init_scale
)
),
shape=[self._hidden_size * 4],
dtype="float32",
default_initializer=paddle.nn.initializer.Constant(0.0),
)
self.bias_arr.append(self.add_parameter(f'b_{i}', bias_1))
def forward(self, input_embedding, init_hidden=None, init_cell=None):
self.cell_array = []
self.hidden_array = []
for i in range(self._num_layers):
pre_hidden = paddle.slice(
init_hidden, axes=[0], starts=[i], ends=[i + 1]
)
pre_cell = paddle.slice(
init_cell, axes=[0], starts=[i], ends=[i + 1]
)
pre_hidden = paddle.reshape(
pre_hidden, shape=[-1, self._hidden_size]
)
pre_cell = paddle.reshape(pre_cell, shape=[-1, self._hidden_size])
self.hidden_array.append(pre_hidden)
self.cell_array.append(pre_cell)
res = []
for index in range(self._num_steps):
self._input = paddle.slice(
input_embedding, axes=[1], starts=[index], ends=[index + 1]
)
self._input = paddle.reshape(
self._input, shape=[-1, self._hidden_size]
)
for k in range(self._num_layers):
pre_hidden = self.hidden_array[k]
pre_cell = self.cell_array[k]
weight_1 = self.weight_1_arr[k]
bias = self.bias_arr[k]
nn = paddle.concat([self._input, pre_hidden], 1)
gate_input = paddle.matmul(x=nn, y=weight_1)
gate_input = paddle.add(gate_input, bias)
i, j, f, o = paddle.split(
gate_input, num_or_sections=4, axis=-1
)
c = pre_cell * paddle.nn.functional.sigmoid(
f
) + paddle.nn.functional.sigmoid(i) * paddle.tanh(j)
m = paddle.tanh(c) * paddle.nn.functional.sigmoid(o)
self.hidden_array[k] = m
self.cell_array[k] = c
self._input = m
if self._dropout is not None and self._dropout > 0.0:
self._input = paddle.nn.functional.dropout(
self._input,
p=self._dropout,
mode='upscale_in_train',
)
res.append(
paddle.reshape(self._input, shape=[1, -1, self._hidden_size])
)
real_res = paddle.concat(res, 0)
real_res = paddle.transpose(x=real_res, perm=[1, 0, 2])
last_hidden = paddle.concat(self.hidden_array, 1)
last_hidden = paddle.reshape(
last_hidden, shape=[-1, self._num_layers, self._hidden_size]
)
last_hidden = paddle.transpose(x=last_hidden, perm=[1, 0, 2])
last_cell = paddle.concat(self.cell_array, 1)
last_cell = paddle.reshape(
last_cell, shape=[-1, self._num_layers, self._hidden_size]
)
last_cell = paddle.transpose(x=last_cell, perm=[1, 0, 2])
return real_res, last_hidden, last_cell
class PtbModel(paddle.nn.Layer):
def __init__(
self,
name_scope,
hidden_size,
vocab_size,
num_layers=2,
num_steps=20,
init_scale=0.1,
dropout=None,
):
super().__init__()
self.hidden_size = hidden_size
self.vocab_size = vocab_size
self.init_scale = init_scale
self.num_layers = num_layers
self.num_steps = num_steps
self.dropout = dropout
self.simple_lstm_rnn = SimpleLSTMRNN(
self.full_name(),
hidden_size,
num_steps,
num_layers=num_layers,
init_scale=init_scale,
dropout=dropout,
)
self.embedding = paddle.nn.Embedding(
num_embeddings=vocab_size,
embedding_dim=hidden_size,
weight_attr=base.ParamAttr(
name='embedding_para',
initializer=paddle.nn.initializer.Uniform(
low=-init_scale, high=init_scale
),
),
)
self.softmax_weight = self.create_parameter(
attr=base.ParamAttr(),
shape=[self.hidden_size, self.vocab_size],
dtype="float32",
default_initializer=paddle.nn.initializer.Uniform(
low=-self.init_scale, high=self.init_scale
),
)
self.softmax_bias = self.create_parameter(
attr=base.ParamAttr(),
shape=[self.vocab_size],
dtype="float32",
default_initializer=paddle.nn.initializer.Uniform(
low=-self.init_scale, high=self.init_scale
),
)
def forward(self, input, label, init_hidden, init_cell):
init_h = paddle.reshape(
init_hidden, shape=[self.num_layers, -1, self.hidden_size]
)
init_c = paddle.reshape(
init_cell, shape=[self.num_layers, -1, self.hidden_size]
)
# NPU 'tok_k' kernel only support `int32` dtype, so cast `input` from `int64` to `int32`.
input = paddle.cast(input, "int32")
x_emb = self.embedding(input)
x_emb = paddle.reshape(
x_emb, shape=[-1, self.num_steps, self.hidden_size]
)
if self.dropout is not None and self.dropout > 0.0:
x_emb = paddle.nn.functional.dropout(
x_emb,
p=self.drop_out,
mode='upscale_in_train',
)
rnn_out, last_hidden, last_cell = self.simple_lstm_rnn(
x_emb, init_h, init_c
)
rnn_out = paddle.reshape(
rnn_out, shape=[-1, self.num_steps, self.hidden_size]
)
projection = paddle.matmul(rnn_out, self.softmax_weight)
projection = paddle.add(projection, self.softmax_bias)
projection = paddle.reshape(projection, shape=[-1, self.vocab_size])
loss = paddle.nn.functional.softmax_with_cross_entropy(
logits=projection, label=label, soft_label=False
)
loss = paddle.reshape(loss, shape=[-1, self.num_steps])
loss = paddle.mean(loss, axis=[0])
loss = paddle.sum(loss)
return loss, last_hidden, last_cell
class TestSaveLoadBase(unittest.TestCase):
def set_place(self):
return (
base.CPUPlace()
if not (core.is_compiled_with_cuda() or is_custom_device())
else get_device_place()
)
def test_ptb_rnn_cpu_float32(self):
seed = 90
hidden_size = 10
vocab_size = 1000
num_layers = 1
num_steps = 3
init_scale = 0.1
batch_size = 4
batch_num = 200
temp_dir = tempfile.TemporaryDirectory()
with new_program_scope():
paddle.seed(seed)
ptb_model = PtbModel(
"ptb_model",
hidden_size=hidden_size,
vocab_size=vocab_size,
num_layers=num_layers,
num_steps=num_steps,
init_scale=init_scale,
)
place = self.set_place()
exe = base.Executor(place)
sgd = Adam(learning_rate=1e-3)
x = paddle.static.data(
name="x", shape=[-1, num_steps], dtype='int64'
)
y = paddle.static.data(name="y", shape=[-1, 1], dtype='float32')
init_hidden = paddle.static.data(
name="init_hidden", shape=[-1, 1], dtype='float32'
)
init_cell = paddle.static.data(
name="init_cell", shape=[-1, 1], dtype='float32'
)
if not in_pir_mode():
x.desc.set_need_check_feed(False)
y.desc.set_need_check_feed(False)
init_hidden.desc.set_need_check_feed(False)
init_cell.desc.set_need_check_feed(False)
static_loss, static_last_hidden, static_last_cell = ptb_model(
x, y, init_hidden, init_cell
)
sgd.minimize(static_loss)
static_param_updated = {}
static_param_init = {}
out = exe.run(paddle.static.default_startup_program())
static_loss_value = None
static_last_cell_value = None
static_last_hidden_value = None
for i in range(batch_num):
x_data = np.arange(12).reshape(4, 3).astype('int64')
y_data = np.arange(1, 13).reshape(4, 3).astype('int64')
x_data = x_data.reshape((-1, num_steps, 1))
y_data = y_data.reshape((-1, 1))
init_hidden_data = np.zeros(
(num_layers, batch_size, hidden_size), dtype='float32'
)
init_cell_data = np.zeros(
(num_layers, batch_size, hidden_size), dtype='float32'
)
fetch_list = [static_loss, static_last_hidden, static_last_cell]
out = exe.run(
paddle.static.default_main_program(),
feed={
"x": x_data,
"y": y_data,
"init_hidden": init_hidden_data,
"init_cell": init_cell_data,
},
fetch_list=fetch_list,
)
static_loss_value = out[0]
static_last_hidden_value = out[1]
static_last_cell_value = out[2]
# get value before save
main_program = paddle.static.default_main_program()
base_map = {}
for var in main_program.list_vars():
if isinstance(var, framework.Parameter) or var.persistable:
if (
in_pir_mode()
and var.get_defining_op().name() == "pd_op.fetch"
):
continue
t = np.array(
base.global_scope().find_var(var.name).get_tensor()
)
# make sure all the parameter or optimizer var have been update
self.assertTrue(np.sum(np.abs(t)) != 0)
base_map[var.name] = t
paddle.static.save(
main_program, os.path.join(temp_dir.name, "test_1")
)
for var in main_program.list_vars():
if isinstance(var, framework.Parameter) or var.persistable:
if (
in_pir_mode()
and var.get_defining_op().name() == "pd_op.fetch"
):
continue
ten = base.global_scope().find_var(var.name).get_tensor()
ten.set(np.zeros_like(np.array(ten)), place)
new_t = np.array(
base.global_scope().find_var(var.name).get_tensor()
)
# make sure all the parameter or optimizer var have been set to zero
self.assertTrue(np.sum(np.abs(new_t)) == 0)
paddle.static.load(
main_program,
os.path.join(temp_dir.name, "test_1.pdparams"),
exe,
)
for var in main_program.list_vars():
if isinstance(var, framework.Parameter) or var.persistable:
if (
in_pir_mode()
and var.get_defining_op().name() == "pd_op.fetch"
):
continue
new_t = np.array(
base.global_scope().find_var(var.name).get_tensor()
)
base_t = base_map[var.name]
np.testing.assert_array_equal(new_t, base_t)
temp_dir.cleanup()
class TestSaveLoadPartial(unittest.TestCase):
def set_place(self):
return (
base.CPUPlace()
if not (core.is_compiled_with_cuda() or is_custom_device())
else get_device_place()
)
def test_ptb_rnn_cpu_float32(self):
seed = 90
hidden_size = 10
vocab_size = 1000
num_layers = 1
num_steps = 3
init_scale = 0.1
batch_size = 4
batch_num = 200
temp_dir = tempfile.TemporaryDirectory()
with new_program_scope():
paddle.seed(seed)
ptb_model = PtbModel(
"ptb_model",
hidden_size=hidden_size,
vocab_size=vocab_size,
num_layers=num_layers,
num_steps=num_steps,
init_scale=init_scale,
)
place = self.set_place()
exe = base.Executor(place)
sgd = Adam(learning_rate=1e-3)
x = paddle.static.data(
name="x", shape=[-1, num_steps], dtype='int64'
)
y = paddle.static.data(name="y", shape=[-1, 1], dtype='float32')
init_hidden = paddle.static.data(
name="init_hidden", shape=[-1, 1], dtype='float32'
)
init_cell = paddle.static.data(
name="init_cell", shape=[-1, 1], dtype='float32'
)
if not in_pir_mode():
x.desc.set_need_check_feed(False)
y.desc.set_need_check_feed(False)
init_hidden.desc.set_need_check_feed(False)
init_cell.desc.set_need_check_feed(False)
static_loss, static_last_hidden, static_last_cell = ptb_model(
x, y, init_hidden, init_cell
)
if in_pir_mode():
test_program = paddle.static.default_main_program().clone()
else:
test_program = paddle.static.default_main_program().clone(
for_test=True
)
sgd.minimize(static_loss)
static_param_updated = {}
static_param_init = {}
out = exe.run(paddle.static.default_startup_program())
static_loss_value = None
static_last_cell_value = None
static_last_hidden_value = None
for i in range(batch_num):
x_data = np.arange(12).reshape(4, 3).astype('int64')
y_data = np.arange(1, 13).reshape(4, 3).astype('int64')
x_data = x_data.reshape((-1, num_steps, 1))
y_data = y_data.reshape((-1, 1))
init_hidden_data = np.zeros(
(num_layers, batch_size, hidden_size), dtype='float32'
)
init_cell_data = np.zeros(
(num_layers, batch_size, hidden_size), dtype='float32'
)
fetch_list = [static_loss, static_last_hidden, static_last_cell]
out = exe.run(
paddle.static.default_main_program(),
feed={
"x": x_data,
"y": y_data,
"init_hidden": init_hidden_data,
"init_cell": init_cell_data,
},
fetch_list=fetch_list,
)
static_loss_value = out[0]
static_last_hidden_value = out[1]
static_last_cell_value = out[2]
# get value before save
main_program = paddle.static.default_main_program()
base_map = {}
for var in main_program.list_vars():
if isinstance(var, framework.Parameter) or var.persistable:
if (
in_pir_mode()
and var.get_defining_op().name() == "pd_op.fetch"
):
continue
t = np.array(
base.global_scope().find_var(var.name).get_tensor()
)
# make sure all the parameter or optimizer var have been update
self.assertTrue(np.sum(np.abs(t)) != 0)
base_map[var.name] = t
paddle.static.save(
main_program, os.path.join(temp_dir.name, "test_1")
)
# set var to zero
for var in main_program.list_vars():
if isinstance(var, framework.Parameter) or var.persistable:
if (
in_pir_mode()
and var.get_defining_op().name() == "pd_op.fetch"
):
continue
ten = base.global_scope().find_var(var.name).get_tensor()
ten.set(np.zeros_like(np.array(ten)), place)
new_t = np.array(
base.global_scope().find_var(var.name).get_tensor()
)
# make sure all the parameter or optimizer var have been set to zero
self.assertTrue(np.sum(np.abs(new_t)) == 0)
paddle.static.load(
test_program, os.path.join(temp_dir.name, "test_1.pdopt"), None
)
for var in test_program.list_vars():
if isinstance(var, framework.Parameter) or var.persistable:
if (
in_pir_mode()
and var.get_defining_op().name() == "pd_op.fetch"
):
continue
new_t = np.array(
base.global_scope().find_var(var.name).get_tensor()
)
base_t = base_map[var.name]
np.testing.assert_array_equal(new_t, base_t)
paddle.static.load(
test_program,
os.path.join(temp_dir.name, "test_1.pdmodel"),
None,
)
temp_dir.cleanup()
class TestSaveLoadSetStateDict(unittest.TestCase):
def set_place(self):
return (
base.CPUPlace()
if not (core.is_compiled_with_cuda() or is_custom_device())
else get_device_place()
)
def test_ptb_rnn_cpu_float32(self):
seed = 90
hidden_size = 10
vocab_size = 1000
num_layers = 1
num_steps = 3
init_scale = 0.1
batch_size = 4
batch_num = 200
temp_dir = tempfile.TemporaryDirectory()
with new_program_scope():
paddle.seed(seed)
ptb_model = PtbModel(
"ptb_model",
hidden_size=hidden_size,
vocab_size=vocab_size,
num_layers=num_layers,
num_steps=num_steps,
init_scale=init_scale,
)
place = self.set_place()
exe = base.Executor(place)
sgd = Adam(learning_rate=1e-3)
x = paddle.static.data(
name="x", shape=[-1, num_steps], dtype='int64'
)
y = paddle.static.data(name="y", shape=[-1, 1], dtype='float32')
init_hidden = paddle.static.data(
name="init_hidden", shape=[-1, 1], dtype='float32'
)
init_cell = paddle.static.data(
name="init_cell", shape=[-1, 1], dtype='float32'
)
if not in_pir_mode():
x.desc.set_need_check_feed(False)
y.desc.set_need_check_feed(False)
init_hidden.desc.set_need_check_feed(False)
init_cell.desc.set_need_check_feed(False)
static_loss, static_last_hidden, static_last_cell = ptb_model(
x, y, init_hidden, init_cell
)
sgd.minimize(static_loss)
static_param_updated = {}
static_param_init = {}
out = exe.run(paddle.static.default_startup_program())
static_loss_value = None
static_last_cell_value = None
static_last_hidden_value = None
for i in range(batch_num):
x_data = np.arange(12).reshape(4, 3).astype('int64')
y_data = np.arange(1, 13).reshape(4, 3).astype('int64')
x_data = x_data.reshape((-1, num_steps, 1))
y_data = y_data.reshape((-1, 1))
init_hidden_data = np.zeros(
(num_layers, batch_size, hidden_size), dtype='float32'
)
init_cell_data = np.zeros(
(num_layers, batch_size, hidden_size), dtype='float32'
)
fetch_list = [static_loss, static_last_hidden, static_last_cell]
out = exe.run(
paddle.static.default_main_program(),
feed={
"x": x_data,
"y": y_data,
"init_hidden": init_hidden_data,
"init_cell": init_cell_data,
},
fetch_list=fetch_list,
)
static_loss_value = out[0]
static_last_hidden_value = out[1]
static_last_cell_value = out[2]
# get value before save
main_program = paddle.static.default_main_program()
base_map = {}
for var in main_program.list_vars():
if isinstance(var, framework.Parameter) or var.persistable:
if (
in_pir_mode()
and var.get_defining_op().name() == "pd_op.fetch"
):
continue
t = np.array(
base.global_scope().find_var(var.name).get_tensor()
)
# make sure all the parameter or optimizer var have been update
self.assertTrue(np.sum(np.abs(t)) != 0)
base_map[var.name] = t
paddle.static.save(
main_program, os.path.join(temp_dir.name, "test_1")
)
# set var to zero
for var in main_program.list_vars():
if isinstance(var, framework.Parameter) or var.persistable:
if (
in_pir_mode()
and var.get_defining_op().name() == "pd_op.fetch"
):
continue
ten = base.global_scope().find_var(var.name).get_tensor()
ten.set(np.zeros_like(np.array(ten)), place)
new_t = np.array(
base.global_scope().find_var(var.name).get_tensor()
)
# make sure all the parameter or optimizer var have been set to zero
self.assertTrue(np.sum(np.abs(new_t)) == 0)
paddle.static.load(
main_program, os.path.join(temp_dir.name, "test_1"), exe
)
for var in main_program.list_vars():
if isinstance(var, framework.Parameter) or var.persistable:
if (
in_pir_mode()
and var.get_defining_op().name() == "pd_op.fetch"
):
continue
new_t = np.array(
base.global_scope().find_var(var.name).get_tensor()
)
base_t = base_map[var.name]
np.testing.assert_array_equal(new_t, base_t)
temp_dir.cleanup()
class TestProgramStatePartial(unittest.TestCase):
def set_place(self):
return (
base.CPUPlace()
if not (core.is_compiled_with_cuda() or is_custom_device())
else get_device_place()
)
def test_ptb_rnn_cpu_float32(self):
seed = 90
hidden_size = 10
vocab_size = 1000
num_layers = 1
num_steps = 3
init_scale = 0.1
batch_size = 4
batch_num = 200
temp_dir = tempfile.TemporaryDirectory()
with new_program_scope():
paddle.seed(seed)
ptb_model = PtbModel(
"ptb_model",
hidden_size=hidden_size,
vocab_size=vocab_size,
num_layers=num_layers,
num_steps=num_steps,
init_scale=init_scale,
)
place = self.set_place()
exe = base.Executor(place)
sgd = Adam(learning_rate=1e-3)
x = paddle.static.data(
name="x", shape=[-1, num_steps], dtype='int64'
)
y = paddle.static.data(name="y", shape=[-1, 1], dtype='float32')
init_hidden = paddle.static.data(
name="init_hidden", shape=[-1, 1], dtype='float32'
)
init_cell = paddle.static.data(
name="init_cell", shape=[-1, 1], dtype='float32'
)
if not in_pir_mode():
x.desc.set_need_check_feed(False)
y.desc.set_need_check_feed(False)
init_hidden.desc.set_need_check_feed(False)
init_cell.desc.set_need_check_feed(False)
static_loss, static_last_hidden, static_last_cell = ptb_model(
x, y, init_hidden, init_cell
)
if in_pir_mode():
test_program = paddle.static.default_main_program().clone()
else:
test_program = paddle.static.default_main_program().clone(
for_test=True
)
sgd.minimize(static_loss)
static_param_updated = {}
static_param_init = {}
out = exe.run(paddle.static.default_startup_program())
static_loss_value = None
static_last_cell_value = None
static_last_hidden_value = None
for i in range(batch_num):
x_data = np.arange(12).reshape(4, 3).astype('int64')
y_data = np.arange(1, 13).reshape(4, 3).astype('int64')
x_data = x_data.reshape((-1, num_steps, 1))
y_data = y_data.reshape((-1, 1))
init_hidden_data = np.zeros(
(num_layers, batch_size, hidden_size), dtype='float32'
)
init_cell_data = np.zeros(
(num_layers, batch_size, hidden_size), dtype='float32'
)
fetch_list = [static_loss, static_last_hidden, static_last_cell]
out = exe.run(
paddle.static.default_main_program(),
feed={
"x": x_data,
"y": y_data,
"init_hidden": init_hidden_data,
"init_cell": init_cell_data,
},
fetch_list=fetch_list,
)
static_loss_value = out[0]
static_last_hidden_value = out[1]
static_last_cell_value = out[2]
# get value before save
main_program = paddle.static.default_main_program()
base_map = {}
for var in main_program.list_vars():
if isinstance(var, framework.Parameter) or var.persistable:
if (
in_pir_mode()
and var.get_defining_op().name() == "pd_op.fetch"
):
continue
t = np.array(
base.global_scope().find_var(var.name).get_tensor()
)
# make sure all the parameter or optimizer var have been update
self.assertTrue(np.sum(np.abs(t)) != 0)
base_map[var.name] = t
paddle.static.save(
main_program, os.path.join(temp_dir.name, 'test_1')
)
# set var to zero
for var in main_program.list_vars():
if isinstance(var, framework.Parameter) or var.persistable:
if (
in_pir_mode()
and var.get_defining_op().name() == "pd_op.fetch"
):
continue
ten = base.global_scope().find_var(var.name).get_tensor()
ten.set(np.zeros_like(np.array(ten)), place)
new_t = np.array(
base.global_scope().find_var(var.name).get_tensor()
)
# make sure all the parameter or optimizer var have been set to zero
self.assertTrue(np.sum(np.abs(new_t)) == 0)
# base.load(test_program, "./test_1", None )
program_state = paddle.static.load_program_state(
os.path.join(temp_dir.name, 'test_1')
)
program_state_1 = paddle.static.load_program_state(
os.path.join(temp_dir.name, 'test_1.pdparams')
)
program_state_2 = paddle.static.load_program_state(
os.path.join(temp_dir.name, 'test_1.pdopt')
)
program_state_3 = paddle.static.load_program_state(
os.path.join(temp_dir.name, 'test_1.pdmodel')
)
paddle.static.set_program_state(test_program, program_state)
for var in test_program.list_vars():
if isinstance(var, framework.Parameter) or var.persistable:
if (
in_pir_mode()
and var.get_defining_op().name() == "pd_op.fetch"
):
continue
new_t = np.array(
base.global_scope().find_var(var.name).get_tensor()
)
base_t = base_map[var.name]
np.testing.assert_array_equal(new_t, base_t)
# check 1
for var in main_program.list_vars():
if isinstance(var, framework.Parameter) or var.persistable:
if (
in_pir_mode()
and var.get_defining_op().name() == "pd_op.fetch"
):
continue
ten = base.global_scope().find_var(var.name).get_tensor()
ten.set(np.zeros_like(np.array(ten)), place)
new_t = np.array(
base.global_scope().find_var(var.name).get_tensor()
)
# make sure all the parameter or optimizer var have been set to zero
self.assertTrue(np.sum(np.abs(new_t)) == 0)
paddle.static.set_program_state(test_program, program_state_1)
for var in test_program.list_vars():
if isinstance(var, framework.Parameter) or var.persistable:
if (
in_pir_mode()
and var.get_defining_op().name() == "pd_op.fetch"
):
continue
new_t = np.array(
base.global_scope().find_var(var.name).get_tensor()
)
base_t = base_map[var.name]
np.testing.assert_array_equal(new_t, base_t)
# check 2
for var in main_program.list_vars():
if isinstance(var, framework.Parameter) or var.persistable:
if (
in_pir_mode()
and var.get_defining_op().name() == "pd_op.fetch"
):
continue
ten = base.global_scope().find_var(var.name).get_tensor()
ten.set(np.zeros_like(np.array(ten)), place)
new_t = np.array(
base.global_scope().find_var(var.name).get_tensor()
)
# make sure all the parameter or optimizer var have been set to zero
self.assertTrue(np.sum(np.abs(new_t)) == 0)
paddle.static.set_program_state(test_program, program_state_2)
for var in test_program.list_vars():
if isinstance(var, framework.Parameter) or var.persistable:
if (
in_pir_mode()
and var.get_defining_op().name() == "pd_op.fetch"
):
continue
new_t = np.array(
base.global_scope().find_var(var.name).get_tensor()
)
base_t = base_map[var.name]
np.testing.assert_array_equal(new_t, base_t)
# check 3
for var in main_program.list_vars():
if isinstance(var, framework.Parameter) or var.persistable:
if (
in_pir_mode()
and var.get_defining_op().name() == "pd_op.fetch"
):
continue
ten = base.global_scope().find_var(var.name).get_tensor()
ten.set(np.zeros_like(np.array(ten)), place)
new_t = np.array(
base.global_scope().find_var(var.name).get_tensor()
)
# make sure all the parameter or optimizer var have been set to zero
self.assertTrue(np.sum(np.abs(new_t)) == 0)
paddle.static.set_program_state(test_program, program_state_3)
for var in test_program.list_vars():
if isinstance(var, framework.Parameter) or var.persistable:
if (
in_pir_mode()
and var.get_defining_op().name() == "pd_op.fetch"
):
continue
new_t = np.array(
base.global_scope().find_var(var.name).get_tensor()
)
base_t = base_map[var.name]
np.testing.assert_array_equal(new_t, base_t)
temp_dir.cleanup()
class TestVariableInit(unittest.TestCase):
def set_place(self):
return (
base.CPUPlace()
if not (core.is_compiled_with_cuda() or is_custom_device())
else get_device_place()
)
def test_variable_init(self):
x = paddle.static.data(name="x", shape=[10, 10], dtype='float32')
y = paddle.static.nn.fc(x, 10)
z = paddle.static.nn.fc(y, 10)
place = self.set_place()
exe = base.Executor(place)
exe.run(paddle.static.default_startup_program())
temp_dir = tempfile.TemporaryDirectory()
paddle.static.save(
paddle.static.default_main_program(),
os.path.join(temp_dir.name, "test_path"),
)
def set_var(var, ndarray):
t = var.get_tensor()
p = t._place()
if p.is_cpu_place():
place = paddle.base.CPUPlace()
elif p.is_cuda_pinned_place():
place = paddle.base.CUDAPinnedPlace()
else:
p = paddle.base.core.Place()
p.set_place(t._place())
place = get_device_place(p.gpu_device_id())
t.set(ndarray, place)
program = paddle.static.default_main_program()
new_scope = base.core.Scope()
place = self.set_place()
exe = base.Executor(place)
if in_pir_mode():
parameter_list = []
for var in program.list_vars():
if var.is_parameter and var.persistable:
parameter_list.append(var)
paddle.base.libpaddle.pir.create_loaded_parameter(
parameter_list, new_scope, exe._default_executor
)
else:
parameter_list = list(
filter(paddle.framework.is_parameter, program.list_vars())
)
base.core._create_loaded_parameter(
parameter_list, new_scope, exe._default_executor
)
parameter_file_name = os.path.join(temp_dir.name, "test_path.pdparams")
with open(parameter_file_name, 'rb') as f:
load_dict = pickle.load(f)
for v in parameter_list:
assert v.name in load_dict, (
f"Can not find [{v.name}] in model file [{parameter_file_name}]"
)
new_v = new_scope.find_var(v.name)
set_var(new_v, load_dict[v.name])
if in_pir_mode():
opt_list = []
for var in program.list_vars():
if var.persistable and not var.is_parameter:
opt_list.append(var)
paddle.base.libpaddle.pir.create_loaded_parameter(
opt_list, new_scope, exe._default_executor
)
else:
opt_list = list(
filter(
paddle.framework.io_utils.is_belong_to_optimizer,
program.list_vars(),
)
)
base.core._create_loaded_parameter(
opt_list, new_scope, exe._default_executor
)
opt_file_name = os.path.join(temp_dir.name, "test_path.pdopt")
with open(opt_file_name, 'rb') as f:
load_dict = pickle.load(f)
for v in opt_list:
assert v.name in load_dict, (
f"Can not find [{v.name}] in model file [{opt_file_name}]"
)
new_v = new_scope.find_var(v.name)
set_var(new_v, load_dict[v.name])
base_map = {}
for var in program.list_vars():
if isinstance(var, framework.Parameter) or var.persistable:
t = np.array(
base.global_scope().find_var(var.name).get_tensor()
)
# make sure all the parameter or optimizer var have been update
base_map[var.name] = t
for var in program.list_vars():
if isinstance(var, framework.Parameter) or var.persistable:
new_t = np.array(new_scope.find_var(var.name).get_tensor())
base_t = base_map[var.name]
np.testing.assert_array_equal(new_t, base_t)
temp_dir.cleanup()
class TestStaticSaveLoadPickle(unittest.TestCase):
def test_pickle_protocol(self):
# enable static graph mode
paddle.enable_static()
with new_program_scope():
# create network
x = paddle.static.data(
name="static_save_load_large_x",
shape=[None, 10],
dtype='float32',
)
if not in_pir_mode():
x.desc.set_need_check_feed(False)
z = paddle.static.nn.fc(x, 10, bias_attr=False)
place = paddle.CPUPlace()
exe = paddle.static.Executor(place)
exe.run(paddle.static.default_startup_program())
prog = paddle.static.default_main_program()
base_map = {}
for var in prog.list_vars():
if isinstance(var, framework.Parameter) or var.persistable:
t = np.array(
base.global_scope().find_var(var.name).get_tensor()
)
# make sure all the parameter or optimizer var have been update
self.assertTrue(np.sum(np.abs(t)) != 0)
base_map[var.name] = t
temp_dir = tempfile.TemporaryDirectory()
path = os.path.join(
temp_dir.name, "test_static_save_load_pickle", "pickle_protocol"
)
with self.assertRaises(ValueError):
paddle.static.save(prog, path, 2.0)
with self.assertRaises(ValueError):
paddle.static.save(prog, path, 1)
with self.assertRaises(ValueError):
paddle.static.save(prog, path, 5)
protocols = [2, 3, 4]
for protocol in protocols:
paddle.static.save(prog, path, protocol)
# set var to zero
for var in prog.list_vars():
if isinstance(var, framework.Parameter) or var.persistable:
if (
in_pir_mode()
and var.get_defining_op().name() == "pd_op.fetch"
):
continue
ten = (
base.global_scope().find_var(var.name).get_tensor()
)
ten.set(np.zeros_like(np.array(ten)), place)
new_t = np.array(
base.global_scope().find_var(var.name).get_tensor()
)
self.assertTrue(np.sum(np.abs(new_t)) == 0)
paddle.static.load(prog, path)
for var in prog.list_vars():
if isinstance(var, framework.Parameter) or var.persistable:
if (
in_pir_mode()
and var.get_defining_op().name() == "pd_op.fetch"
):
continue
new_t = np.array(
base.global_scope().find_var(var.name).get_tensor()
)
base_t = base_map[var.name]
np.testing.assert_array_equal(new_t, base_t)
class TestSaveLoadInferenceModel(unittest.TestCase):
def setUp(self):
self.temp_dir = tempfile.TemporaryDirectory()
self.model_path = os.path.join(self.temp_dir.name, 'no_params')
def tearDown(self):
self.temp_dir.cleanup()
def test_no_params(self):
main_program = paddle.static.Program()
with paddle.static.program_guard(main_program):
x = paddle.static.data(name="x", shape=[10, 10], dtype='float32')
if not in_pir_mode():
x.desc.set_need_check_feed(False)
y = x + x
place = paddle.CPUPlace()
exe = paddle.static.Executor(place)
paddle.static.save_inference_model(self.model_path, [x], [y], exe)
[
inference_program,
feed_target_names,
fetch_targets,
] = paddle.static.load_inference_model(self.model_path, exe)
self.assertEqual(feed_target_names, ['x'])
if in_pir_mode():
self.assertEqual(fetch_targets[0].shape, [10, 10])
ops = [op.name() for op in inference_program.global_block().ops]
self.assertEqual(
ops,
[
'pd_op.data',
'pd_op.add',
'pd_op.fetch',
],
)
else:
self.assertEqual(fetch_targets[0].shape, (10, 10))
ops = [op.type for op in inference_program.block(0).ops]
self.assertEqual(ops, ['feed', 'elementwise_add', 'fetch'])
if __name__ == '__main__':
paddle.enable_static()
unittest.main()