diff --git a/deepmd/descriptor/se_a.py b/deepmd/descriptor/se_a.py index 8f0051cd4e..2de0b63245 100644 --- a/deepmd/descriptor/se_a.py +++ b/deepmd/descriptor/se_a.py @@ -469,13 +469,6 @@ def enable_compression( "empty embedding-net are not supported in model compression!" ) - for ii in range(len(self.filter_neuron) - 1): - if self.filter_neuron[ii] * 2 != self.filter_neuron[ii + 1]: - raise NotImplementedError( - "Model Compression error: descriptor neuron [%s] is not supported by model compression! " - "The size of the next layer of the neural network must be twice the size of the previous layer." - % ",".join([str(item) for item in self.filter_neuron]) - ) if self.stripped_type_embedding: ret_two_side = get_pattern_nodes_from_graph_def( graph_def, f"filter_type_all{suffix}/.+_two_side_ebd" diff --git a/deepmd/descriptor/se_atten.py b/deepmd/descriptor/se_atten.py index 8f3be40596..8e4c3c3ef6 100644 --- a/deepmd/descriptor/se_atten.py +++ b/deepmd/descriptor/se_atten.py @@ -387,14 +387,6 @@ def enable_compression( "empty embedding-net are not supported in model compression!" ) - for ii in range(len(self.filter_neuron) - 1): - if self.filter_neuron[ii] * 2 != self.filter_neuron[ii + 1]: - raise NotImplementedError( - "Model Compression error: descriptor neuron [%s] is not supported by model compression! " - "The size of the next layer of the neural network must be twice the size of the previous layer." - % ",".join([str(item) for item in self.filter_neuron]) - ) - if self.attn_layer != 0: raise RuntimeError("can not compress model when attention layer is not 0.") diff --git a/deepmd/descriptor/se_r.py b/deepmd/descriptor/se_r.py index fbc54a651f..ae926c339f 100644 --- a/deepmd/descriptor/se_r.py +++ b/deepmd/descriptor/se_r.py @@ -334,14 +334,6 @@ def enable_compression( not self.filter_resnet_dt ), "Model compression error: descriptor resnet_dt must be false!" - for ii in range(len(self.filter_neuron) - 1): - if self.filter_neuron[ii] * 2 != self.filter_neuron[ii + 1]: - raise NotImplementedError( - "Model Compression error: descriptor neuron [%s] is not supported by model compression! " - "The size of the next layer of the neural network must be twice the size of the previous layer." - % ",".join([str(item) for item in self.filter_neuron]) - ) - self.compress = True self.table = DPTabulate( self, diff --git a/deepmd/descriptor/se_t.py b/deepmd/descriptor/se_t.py index 671dbd4e15..d0c9fcbc2e 100644 --- a/deepmd/descriptor/se_t.py +++ b/deepmd/descriptor/se_t.py @@ -349,14 +349,6 @@ def enable_compression( not self.filter_resnet_dt ), "Model compression error: descriptor resnet_dt must be false!" - for ii in range(len(self.filter_neuron) - 1): - if self.filter_neuron[ii] * 2 != self.filter_neuron[ii + 1]: - raise NotImplementedError( - "Model Compression error: descriptor neuron [%s] is not supported by model compression! " - "The size of the next layer of the neural network must be twice the size of the previous layer." - % ",".join([str(item) for item in self.filter_neuron]) - ) - self.compress = True self.table = DPTabulate( self, diff --git a/deepmd/utils/tabulate.py b/deepmd/utils/tabulate.py index 427887089a..d0a167f1dc 100644 --- a/deepmd/utils/tabulate.py +++ b/deepmd/utils/tabulate.py @@ -571,13 +571,13 @@ def _make_data(self, xx, idx): + xx ) dy = op_module.unaggregated_dy_dx_s( - yy, + yy - xx, self.matrix["layer_" + str(layer + 1)][idx], xbar, tf.constant(self.functype), ) + tf.ones([1, 1], yy.dtype) dy2 = op_module.unaggregated_dy2_dx_s( - yy, + yy - xx, dy, self.matrix["layer_" + str(layer + 1)][idx], xbar, @@ -626,26 +626,72 @@ def _make_data(self, xx, idx): tf.matmul(yy, self.matrix["layer_" + str(layer + 1)][idx]) + self.bias["layer_" + str(layer + 1)][idx] ) - tt, zz = self._layer_1( - yy, - self.matrix["layer_" + str(layer + 1)][idx], - self.bias["layer_" + str(layer + 1)][idx], - ) - dz = op_module.unaggregated_dy_dx( - zz - tt, - self.matrix["layer_" + str(layer + 1)][idx], - dy, - ybar, - tf.constant(self.functype), - ) - dy2 = op_module.unaggregated_dy2_dx( - zz - tt, - self.matrix["layer_" + str(layer + 1)][idx], - dy, - dy2, - ybar, - tf.constant(self.functype), - ) + if self.neuron[layer] == self.neuron[layer - 1]: + zz = ( + self._layer_0( + yy, + self.matrix["layer_" + str(layer + 1)][idx], + self.bias["layer_" + str(layer + 1)][idx], + ) + + yy + ) + dz = op_module.unaggregated_dy_dx( + zz - yy, + self.matrix["layer_" + str(layer + 1)][idx], + dy, + ybar, + tf.constant(self.functype), + ) + dy2 = op_module.unaggregated_dy2_dx( + zz - yy, + self.matrix["layer_" + str(layer + 1)][idx], + dy, + dy2, + ybar, + tf.constant(self.functype), + ) + elif self.neuron[layer] == 2 * self.neuron[layer - 1]: + tt, zz = self._layer_1( + yy, + self.matrix["layer_" + str(layer + 1)][idx], + self.bias["layer_" + str(layer + 1)][idx], + ) + dz = op_module.unaggregated_dy_dx( + zz - tt, + self.matrix["layer_" + str(layer + 1)][idx], + dy, + ybar, + tf.constant(self.functype), + ) + dy2 = op_module.unaggregated_dy2_dx( + zz - tt, + self.matrix["layer_" + str(layer + 1)][idx], + dy, + dy2, + ybar, + tf.constant(self.functype), + ) + else: + zz = self._layer_0( + yy, + self.matrix["layer_" + str(layer + 1)][idx], + self.bias["layer_" + str(layer + 1)][idx], + ) + dz = op_module.unaggregated_dy_dx( + zz, + self.matrix["layer_" + str(layer + 1)][idx], + dy, + ybar, + tf.constant(self.functype), + ) + dy2 = op_module.unaggregated_dy2_dx( + zz, + self.matrix["layer_" + str(layer + 1)][idx], + dy, + dy2, + ybar, + tf.constant(self.functype), + ) dy = dz yy = zz diff --git a/source/op/unaggregated_grad.cc b/source/op/unaggregated_grad.cc index 9a61a3bac9..cf645f6c21 100644 --- a/source/op/unaggregated_grad.cc +++ b/source/op/unaggregated_grad.cc @@ -168,7 +168,9 @@ struct UnaggregatedDyDxFunctor { accumulator += w[jj * width + ii] * dy_dx[kk * size + jj]; } dz_drou *= accumulator; - dz_drou += dy_dx[kk * size + ii % size]; + if (width == 2 * size || width == size) { + dz_drou += dy_dx[kk * size + ii % size]; + } dz_dx[kk * width + ii] = dz_drou; } } @@ -256,7 +258,9 @@ struct UnaggregatedDy2DxFunctor { dz_drou += grad_grad(ybar[kk * width + ii], z[kk * width + ii], functype) * accumulator * accumulator; - dz_drou += dy2_dx[kk * size + ii % size]; + if (width == 2 * size || width == size) { + dz_drou += dy2_dx[kk * size + ii % size]; + } dz2_dx[kk * width + ii] = dz_drou; } } diff --git a/source/tests/model_compression/input.json b/source/tests/model_compression/input.json index be64bfb2cf..f750e564d2 100644 --- a/source/tests/model_compression/input.json +++ b/source/tests/model_compression/input.json @@ -13,10 +13,12 @@ ], "rcut_smth": 0.50, "rcut": 6.00, + "_comment": "N2=2N1, N2=N1, and otherwise can be tested", "neuron": [ 4, 8, - 16 + 17, + 17 ], "resnet_dt": false, "axis_neuron": 16,