what(): Can't reshape the output tensor, it is readonly at [/paddle/paddle/fluid/inference/api/details/zero_copy_tensor.cc:28]
本地训练后,写了一个c++测试一下,模型预测是否成功。cpu,单机。
#include <iostream> #include <numeric> #include "paddle_inference_api.h" using namespace std; namespace paddle { void CreateConfig(AnalysisConfig *config) { // 模型从磁盘进行加载 // config->SetModel(model_dirname + "/model", // model_dirname + "/params"); config->SetModel("./model", "./params"); // 如果模型从内存中加载,可以使用SetModelBuffer接口 // config->SetModelBuffer(prog_buffer, prog_size, params_buffer, params_size); // config->EnableUseGpu(10 /*the initial size of the GPU memory pool in MB*/, 0 /*gpu_id*/); // for cpu config->DisableGpu(); // config->EnableMKLDNN(); // 可选 config->SetCpuMathLibraryNumThreads(10); // 当使用ZeroCopyTensor的时候,此处一定要设置为false。 config->SwitchUseFeedFetchOps(false); // 当多输入的时候,此处一定要设置为true config->SwitchSpecifyInputNames(true); // config->SwitchIrDebug(true); // 开关打开,会在每个图优化过程后生成dot文件,方便可视化。 // config->SwitchIrOptim(false); // 默认为true。如果设置为false,关闭所有优化,执行过程同 NativePredictor // config->EnableMemoryOptim(); // 开启内存/显存复用 } void RunAnalysis(vector<int64_t>& inputs, float *dense) { // 1. 创建AnalysisConfig AnalysisConfig config; CreateConfig(&config); // 2. 根据config 创建predictor auto predictor = CreatePaddlePredictor(config); // 3. 创建输入 // 同NativePredictor样例一样,此处可以使用PaddleTensor来创建输入 // 以下的代码中使用了ZeroCopy的接口,同使用PaddleTensor不同的是:此接口可以避免预测中多余的cpu copy,提升预测性能。 auto input_names = predictor->GetInputNames(); auto sparse_input_t = predictor->GetInputTensor(input_names[0]); sparse_input_t->SetLoD({{0, inputs.size()}}); sparse_input_t->Reshape({1, inputs.size()}); sparse_input_t->copy_from_cpu(inputs.data()); auto dense_input_t = predictor->GetInputTensor(input_names[1]); dense_input_t->Reshape({1, 2}); dense_input_t->copy_from_cpu(dense); bool ret = predictor->ZeroCopyRun(); if (!ret) { cout << "failed to infer with paddle predictor" << endl; return; } std::vector<float> infer_res; auto output_names = predictor->GetOutputNames(); auto cvr_t = predictor->GetOutputTensor(output_names[1]); std::vector<int> output_shape = cvr_t->shape(); int out_num = std::accumulate(output_shape.begin(), output_shape.end(), 1, std::multiplies<int>()); infer_res.resize(out_num); cvr_t->copy_to_cpu(infer_res.data()); float pcvr = infer_res[0]; cout << pcvr << endl; } } // namespace paddle int main() { vector<int64_t> item; item.push_back(1); item.push_back(2); item.push_back(3); item.push_back(4); float dense[2] = {0.4, 0.5}; paddle::RunAnalysis(item, dense); return 0; }
模型在这个paddlecloud任务里,
详细日志:
resource_list: nodes=20,walltime=48:00:00,resource=full
qsubf arguments confirmation:
-N xuzhang_scvr_yangzhifeng01_20191119_paddlecloud
-v PLATFORM=maybach
--conf /home/paddle/cloud/job/job-0bb5dd39ddb5be22/submit/qsub_f.conf
--hdfs afs://tianqi.afs.baidu.com:9902
--ugi fcr-tianqi-d,absUPEwUB7nc
--hout /app/ecom/brand/yangzhifeng01/scvr/output/08b5e88a-7b60-5ee6-b215-bcd484367c19/job-0bb5dd39ddb5be22/
--files [./paddle]
[INFO] client.version: 3.5.0
[INFO] session.id: 19772208.yq01-smart-000.yq01.baidu.com
[INFO] making tar.gz: from [./paddle]
[INFO] making tar.gz done: size=837925
[INFO] uploading the job package finished.
[INFO] qsub_f: jobid=app-user-20191119154646-25171.yq01-hpc-lvliang01-smart-master.dmop.baidu.com, pls waiting for complete!
[INFO] qsub_f: see more at http://yq01-hpc-lvliang01-mon.dmop.baidu.com:8919/taskinfo.html?appId=app-user-20191119154646-25171
[INFO] qsub_f: to stop, pls run: qdel app-user-20191119154646-25171.yq01-hpc-lvliang01-smart-master.dmop.baidu.com
fluid 1.6.0版本,用c++加载模型预测。