PaddlePaddle / Paddle

PArallel Distributed Deep LEarning: Machine Learning Framework from Industrial Practice (『飞桨』核心框架,深度学习&机器学习高性能单机、分布式训练和跨平台部署)
http://www.paddlepaddle.org/
Apache License 2.0
22.2k stars 5.57k forks source link

CAPI加载配置问题,inArgs.size() == dataLayers_.size() (1 vs. 0) #9276

Closed xibinch closed 6 years ago

xibinch commented 6 years ago

python版本的可以跑通,但是用生成config.bin用CAPI来加载时候回发现没有dataLayer,请问这是配置哪的问题?

network_config.py

import sys
import math
import gzip

from paddle.v2.layer import parse_network
import paddle.v2 as paddle

def convolution_net(dict_dim,
                    class_dim=2,
                    emb_dim=128,
                    hid_dim=64,
                    is_infer=False):

    # input layers
    data = paddle.layer.data("word",
                             paddle.data_type.integer_value_sequence(dict_dim))
    lbl = paddle.layer.data("label", paddle.data_type.integer_value(class_dim))

    # embedding layer
    emb = paddle.layer.embedding(input=data, size=emb_dim)

    # convolution layers with max pooling
    conv_2 = paddle.networks.sequence_conv_pool(
        input=emb, context_len=2, hidden_size=hid_dim)
    conv_3 = paddle.networks.sequence_conv_pool(
        input=emb, context_len=3, hidden_size=hid_dim)
    conv_4 = paddle.networks.sequence_conv_pool(
        input=emb, context_len=4, hidden_size=hid_dim)
    conv_5 = paddle.networks.sequence_conv_pool(
        input=emb, context_len=5, hidden_size=hid_dim)
    conv_6 = paddle.networks.sequence_conv_pool(
        input=emb, context_len=6, hidden_size=hid_dim)
    conv_8 = paddle.networks.sequence_conv_pool(
        input=emb, context_len=8, hidden_size=hid_dim)

    # fc and output layer
    prob = paddle.layer.fc(
        input=[conv_2, conv_3, conv_4, conv_5,conv_6, conv_8], size=class_dim, act=paddle.activation.Softmax())

    if is_infer:
        return prob
    else:
        cost = paddle.layer.cross_entropy_cost(input=prob, label=lbl)

        return cost, prob, lbl

prob = convolution_net(dict_dim=11679, class_dim=46, is_infer=True)
F0321 10:20:55.371634 32018 NeuralNetwork.cpp:250] Check failed: inArgs.size() == dataLayers_.size() (1 vs. 0)
*** Check failure stack trace: ***
    @     0x7f3147e0107d  google::LogMessage::Fail()
    @     0x7f3147e04b2c  google::LogMessage::SendToLog()
    @     0x7f3147e00ba3  google::LogMessage::Flush()
    @     0x7f3147e0603e  google::LogMessageFatal::~LogMessageFatal()
    @     0x7f3147f79132  paddle::NeuralNetwork::forward()
    @     0x7f3147dfc0f6  paddle_gradient_machine_forward
    @           0x45394e  vqu::IntentCnnPredictor::_get_cnn_predict()
    @           0x45420f  vqu::IntentCnnPredictor::predict()
    @           0x4530e5  TestSuite_cnn_Test::TestBody()
    @           0x47a704  testing::internal::HandleSehExceptionsInMethodIfSupported<>()
    @           0x47dc5c  testing::internal::HandleExceptionsInMethodIfSupported<>()
    @           0x46ef34  testing::Test::Run()
    @           0x46f05e  testing::TestInfo::Run()
    @           0x46f124  testing::TestCase::Run()
    @           0x478377  testing::internal::UnitTestImpl::RunAllTests()
    @           0x47a794  testing::internal::HandleSehExceptionsInMethodIfSupported<>()
    @           0x47d8d5  testing::internal::HandleExceptionsInMethodIfSupported<>()
    @           0x46d73d  testing::UnitTest::Run()
    @           0x452e6f  main
    @     0x7f31471ecbd5  __libc_start_main
    @           0x452f59  (unknown)
    @              (nil)  (unknown)
Aborted (core dumped)
typhoonzero commented 6 years ago

不是很确定,是参考 这里 https://github.com/PaddlePaddle/Paddle/tree/develop/paddle/capi/examples/model_inference 的步骤进行的么?

xibinch commented 6 years ago

是的,按照这个上面做的转换成二进制,然后用capi加载进行预测,就报上面的提到的错误

.py配置有问题吗, 这个错误看着像是所没有dataLayer?, 但是我的配置里定义了 data = paddle.layer.data("word", paddle.data_type.integer_value_sequence(dict_dim))

typhoonzero commented 6 years ago

v2模型转换请参考:https://github.com/PaddlePaddle/Paddle/blob/develop/doc/v2/howto/capi/workflow_of_capi_cn.md

xibinch commented 6 years ago

使用这个脚本dump会问题,无法转换, 0.10 和0.11有什么差别,为什么python版本可以,CAPI就问题比较多? File "./dump.py", line 17, in predict = convolution_net(dict_dim=11679, class_dim=46, is_infer=True) File "/cnn_model/network_conf.py", line 31, in convolution_net paddle.data_type.integer_value_sequence(dict_dim)) File "python27-gcc482/lib/python2.7/site-packages/paddle/v2/config_base.py", line 52, in wrapped out = f(args, xargs) File "/python27-gcc482/lib/python2.7/site-packages/paddle/v2/layer.py", line 88, in __data_layer__ l = v1_layers.data_layer(name, type.dim, kwargs) File "/lib/python2.7/site-packages/paddle/trainer_config_helpers/layers.py", line 415, in wrapper return method(args, kwargs) File "/lib/python2.7/site-packages/paddle/trainer_config_helpers/layers.py", line 963, in data_layer ExtraLayerAttribute.to_kwargs(layer_attr)) File "/lib/python2.7/site-packages/paddle/trainer/config_parser.py", line 3943, in Layer return layer_func(name, **xargs) File "/lib/python2.7/site-packages/paddle/trainer/config_parser.py", line 1990, in init name, 'data', size, inputs=[], device=device) File "/lib/python2.7/site-packages/paddle/trainer/config_parser.py", line 1555, in init 'Duplicated layer name: %s' % name) File "/lib/python2.7/site-packages/paddle/trainer/config_parser.py", line 161, in config_assert logger.fatal(msg) File "/python27-gcc482/lib/python2.7/site-packages/paddle/trainer/config_parser.py", line 4293, in my_fatal raise Exception()

Xreki commented 6 years ago

你是怎么生成config.bin的?

xibinch commented 6 years ago

14 from paddle.utils.dump_v2_config import dump_v2_config 15 from network_conf import convolution_net 16 17 predict = convolution_net(dict_dim=11679, class_dim=46, is_infer=True) 18 dump_v2_config(predict, "network_config.bin", True)

利用上面的脚本生成的,现在可以通过 paddlepaddle 0.11.0版本的可以生成了,但是有运行时候有新的错误

F0321 16:04:08.828732 2734 ContextProjection.cpp:108] Check failed: in_->sequenceStartPositions Check failure stack trace: @ 0x7feffd29f07d google::LogMessage::Fail() @ 0x7feffd2a2b2c google::LogMessage::SendToLog() @ 0x7feffd29eba3 google::LogMessage::Flush() @ 0x7feffd2a403e google::LogMessageFatal::~LogMessageFatal() @ 0x7feffd3f2233 paddle::ContextProjection::forward() @ 0x7feffd349989 paddle::MixedLayer::forward()

xibinch commented 6 years ago

前向计算的时候怎么判断数据输入是否正确?

typhoonzero commented 6 years ago

应该至少过滤掉空sequence,并检查数据size是否符合模型配置。

xibinch commented 6 years ago

sequence数据需要设置pos, 安装样例修改代码后还有其他错误

修改C代码如下,使用一个测试输入 256 int tmp_ids[] = {18, 79, 39, 46, 261, 1460, 2873}; 257 258 paddle_ivector sentence = paddle_ivector_create( 259 tmp_ids, id_len, false, false); 260 261 paddle_arguments in_args = paddle_arguments_create_none(); 262 //There is only one input of this network. 263 CHECK_PADDLE_RET(paddle_arguments_resize(in_args, 1)); 264 CHECK_PADDLE_RET(paddle_arguments_set_ids(in_args, 0, sentence)); 265 266 int seq_pos_array[] = {0, sizeof(tmp_ids)/ sizeof(int)}; 267 paddle_ivector seq_pos = paddle_ivector_create(seq_pos_array, sizeof(tmp_ids)/sizeof(int), false, false); 268 CHECK_PADDLE_RET(paddle_arguments_set_sequence_start_pos(in_args, 0, 0, seq_pos)); 269 270 paddle_arguments out_args = paddle_arguments_create_none(); 271 272 // predict by network 273 CHECK_PADDLE_RET(paddle_gradient_machine_forward(_machine, 274 in_args, out_args, false));

F0321 19:35:19.725028 3886 Matrix.h:262] Check failed: startRow + numRows <= getHeight() (8 vs. 7) Check failure stack trace: @ 0x7fbaec48c07d google::LogMessage::Fail() @ 0x7fbaec48fb2c google::LogMessage::SendToLog() @ 0x7fbaec48bba3 google::LogMessage::Flush() @ 0x7fbaec49103e google::LogMessageFatal::~LogMessageFatal() @ 0x7fbaec6861ff paddle::Matrix::subMatrix() @ 0x7fbaec664a39 paddle::ContextProjectionForward<>()

xibinch commented 6 years ago

int seq_pos_array[] = {0, sizeof(tmp_ids)/ sizeof(int)};

问题出在这个地方, 这个数组第一个值设置成 词ID的起始编号, 数组第二个值设置成 当前句子词个数,可以跑通过

typhoonzero commented 6 years ago

感谢记录过程!先关闭这个issue了~