{"action":"created","comment":{"url":"https://api.github.com/repos/PaddlePaddle/Paddle/pulls/comments/223588279","pull_request_review_id":162749973,"id":223588279,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIyMzU4ODI3OQ==","diff_hunk":"@@ -0,0 +1,315 @@\n+// Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserved.\n+//\n+// Licensed under the Apache License, Version 2.0 (the \"License\");\n+// you may not use this file except in compliance with the License.\n+// You may obtain a copy of the License at\n+//\n+//     http://www.apache.org/licenses/LICENSE-2.0\n+//\n+// Unless required by applicable law or agreed to in writing, software\n+// distributed under the License is distributed on an \"AS IS\" BASIS,\n+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n+// See the License for the specific language governing permissions and\n+// limitations under the License.\n+\n+#include \"paddle/fluid/framework/ir/conv_bn_fuse_pass.h\"\n+#include <functional>\n+#include <string>\n+#include <vector>\n+#include \"paddle/fluid/framework/lod_tensor.h\"\n+#include \"paddle/fluid/operators/math/cpu_vec.h\"\n+#include \"paddle/fluid/platform/enforce.h\"\n+\n+namespace paddle {\n+namespace framework {\n+namespace ir {\n+\n+#define GET_CONV_BN_NODES(pattern_name)                                      \\\n+  /* OPERATORS */                                                            \\\n+  GET_IR_NODE_FROM_SUBGRAPH(conv, conv, pattern_name);                       \\\n+  GET_IR_NODE_FROM_SUBGRAPH(batch_norm, batch_norm, pattern_name);           \\\n+  /* CONV inputs */                                                          \\\n+  GET_IR_NODE_FROM_SUBGRAPH(conv_weight, conv_weight, pattern_name);         \\\n+  /* CONV outputs */                                                         \\\n+  GET_IR_NODE_FROM_SUBGRAPH(conv_out, conv_out, pattern_name);               \\\n+  /* BN inputs */                                                            \\\n+  GET_IR_NODE_FROM_SUBGRAPH(bn_scale, bn_scale, pattern_name);               \\\n+  GET_IR_NODE_FROM_SUBGRAPH(bn_bias, bn_bias, pattern_name);                 \\\n+  GET_IR_NODE_FROM_SUBGRAPH(bn_mean, bn_mean, pattern_name);                 \\\n+  GET_IR_NODE_FROM_SUBGRAPH(bn_variance, bn_variance, pattern_name);         \\\n+  /* BN outputs */                                                           \\\n+  GET_IR_NODE_FROM_SUBGRAPH(bn_out, bn_out, pattern_name); /* Out */         \\\n+  GET_IR_NODE_FROM_SUBGRAPH(bn_mean_out, bn_mean_out, pattern_name);         \\\n+  GET_IR_NODE_FROM_SUBGRAPH(bn_variance_out, bn_variance_out, pattern_name); \\\n+  GET_IR_NODE_FROM_SUBGRAPH(bn_saved_mean, bn_saved_mean, pattern_name);     \\\n+  GET_IR_NODE_FROM_SUBGRAPH(bn_saved_variance, bn_saved_variance, pattern_name)\n+\n+LoDTensor tensor_apply(const LoDTensor& vec, float (*f)(float)) {\n+  LoDTensor vec_y;\n+  vec_y.Resize(vec.dims());\n+  const float* x = vec.data<float>();\n+  float* y = vec_y.mutable_data<float>(platform::CPUPlace());\n+  for (int64_t i = 0; i < vec.numel(); i++) {\n+    y[i] = f(x[i]);\n+  }\n+  return vec_y;\n+}\n+\n+void tensor_apply_inplace(LoDTensor* vec, float (*f)(float)) {\n+  float* data = vec->mutable_data<float>(platform::CPUPlace());\n+  for (int64_t i = 0; i < vec->numel(); i++) {\n+    data[i] = f(data[i]);\n+  }\n+}\n+\n+template <typename BinaryOperation>\n+LoDTensor tensor_apply_eltwise(const LoDTensor& vec_a, const LoDTensor& vec_b,\n+                               BinaryOperation f) {\n+  PADDLE_ENFORCE_EQ(vec_a.dims(), vec_b.dims());\n+  LoDTensor vec_y;\n+  vec_y.Resize(vec_a.dims());\n+  const float* a = vec_a.data<float>();\n+  const float* b = vec_b.data<float>();\n+  float* y = vec_y.mutable_data<float>(platform::CPUPlace());\n+  for (int64_t i = 0; i < vec_a.numel(); i++) {\n+    y[i] = f(a[i], b[i]);\n+  }\n+  return vec_y;\n+}\n+\n+template <typename BinaryOperation>\n+LoDTensor tensor_apply_eltwise_broadcast(const LoDTensor& vec_a,\n+                                         const LoDTensor& vec_b,\n+                                         BinaryOperation f) {\n+  PADDLE_ENFORCE_EQ(vec_a.dims().size(), 2);\n+  PADDLE_ENFORCE_EQ(vec_b.dims().size(), 2);\n+  PADDLE_ENFORCE_EQ(vec_a.dims()[0], vec_b.dims()[0]);\n+  PADDLE_ENFORCE_EQ(vec_b.dims()[1], 1);\n+  LoDTensor vec_y;\n+  vec_y.Resize(vec_a.dims());\n+  const float* a = vec_a.data<float>();\n+  const float* b = vec_b.data<float>();\n+  float* y = vec_y.mutable_data<float>(platform::CPUPlace());\n+  size_t a_height = vec_a.dims()[0];\n+  size_t a_width = vec_a.dims()[1];\n+  for (size_t h = 0; h < a_height; h++) {\n+    for (size_t w = 0; w < a_width; ++w) {\n+      *(y++) = f(*(a++), b[h]);\n+    }\n+  }\n+  return vec_y;\n+}\n+\n+// reshape to two dimensions {A, B * C * ...}\n+void make_tensor_2d(LoDTensor* tensor_to_reshape) {\n+  auto dims_count = tensor_to_reshape->dims().size();\n+  PADDLE_ENFORCE_GT(dims_count, 0);\n+\n+  int size2 = 1;\n+  for (int i = 1; i < dims_count; i++) {\n+    size2 *= tensor_to_reshape->dims()[i];\n+  }\n+  tensor_to_reshape->Resize(make_ddim({tensor_to_reshape->dims()[0], size2}));\n+}\n+\n+void recompute_conv_weights(LoDTensor* weights, LoDTensor* tmp) {\n+  // remember the weights tensor shape {A, B, C, ...}\n+  auto weights_shape = weights->dims();\n+  // reduce the weights to 2d {A, B * C * ...}\n+  make_tensor_2d(weights);\n+  // make tmp tensor 2d by adding 1 as second dim {A, 1}\n+  make_tensor_2d(tmp);\n+\n+  *weights =\n+      tensor_apply_eltwise_broadcast(*weights, *tmp, std::multiplies<float>());\n+  // reshape weights to the original dims {A, B, C, ...}\n+  weights->Resize(weights_shape);\n+}\n+\n+void recompute_bias_and_weights(const Scope* scope,\n+                                ir::Node* conv_weight,            //\n+                                const ir::Node& bn_scale,         //\n+                                const LoDTensor& bn_bias_tensor,  //\n+                                const ir::Node& bn_mean,          //\n+                                const ir::Node& bn_variance,      //\n+                                LoDTensor* eltwise_y_in_tensor) {\n+  // Re-compute bias of conv2d from BN\n+  PADDLE_ENFORCE_EQ(eltwise_y_in_tensor->dims(), bn_bias_tensor.dims());\n+\n+  auto* scale_tensor = scope->FindVar(bn_scale.Name())->GetMutable<LoDTensor>();\n+  auto* variance_tensor =\n+      scope->FindVar(bn_variance.Name())->GetMutable<LoDTensor>();\n+  auto* mean_tensor = scope->FindVar(bn_mean.Name())->GetMutable<LoDTensor>();\n+\n+  auto std_tensor = LoDTensor();\n+  std_tensor.Resize(bn_bias_tensor.dims());\n+  std_tensor =\n+      tensor_apply(*variance_tensor, [](float x) { return x + 1e-5f; });\n+\n+  tensor_apply_inplace(&std_tensor, std::sqrt);","path":"paddle/fluid/framework/ir/conv_bn_fuse_pass.cc","position":149,"original_position":149,"commit_id":"78f98294c22a189457b9ef85cf89025c1f570d8d","original_commit_id":"78f98294c22a189457b9ef85cf89025c1f570d8d","user":{"login":"luotao1","id":6836917,"node_id":"MDQ6VXNlcjY4MzY5MTc=","avatar_url":"https://avatars0.githubusercontent.com/u/6836917?v=4","gravatar_id":"","url":"https://api.github.com/users/luotao1","html_url":"https://github.com/luotao1","followers_url":"https://api.github.com/users/luotao1/followers","following_url":"https://api.github.com/users/luotao1/following{/other_user}","gists_url":"https://api.github.com/users/luotao1/gists{/gist_id}","starred_url":"https://api.github.com/users/luotao1/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/luotao1/subscriptions","organizations_url":"https://api.github.com/users/luotao1/orgs","repos_url":"https://api.github.com/users/luotao1/repos","events_url":"https://api.github.com/users/luotao1/events{/privacy}","received_events_url":"https://api.github.com/users/luotao1/received_events","type":"User","site_admin":false},"body":"Could you use the same sqrt function with `EIGEN_USE_FAST`?","created_at":"2018-10-09T07:37:49Z","updated_at":"2018-10-09T07:39:21Z","html_url":"https://github.com/PaddlePaddle/Paddle/pull/13486#discussion_r223588279","pull_request_url":"https://api.github.com/repos/PaddlePaddle/Paddle/pulls/13486","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/PaddlePaddle/Paddle/pulls/comments/223588279"},"html":{"href":"https://github.com/PaddlePaddle/Paddle/pull/13486#discussion_r223588279"},"pull_request":{"href":"https://api.github.com/repos/PaddlePaddle/Paddle/pulls/13486"}}},"pull_request":{"url":"https://api.github.com/repos/PaddlePaddle/Paddle/pulls/13486","id":216565338,"node_id":"MDExOlB1bGxSZXF1ZXN0MjE2NTY1MzM4","html_url":"https://github.com/PaddlePaddle/Paddle/pull/13486","diff_url":"https://github.com/PaddlePaddle/Paddle/pull/13486.diff","patch_url":"https://github.com/PaddlePaddle/Paddle/pull/13486.patch","issue_url":"https://api.github.com/repos/PaddlePaddle/Paddle/issues/13486","number":13486,"state":"open","locked":false,"title":"Sfraczek/conv bn fuse pass","user":{"login":"sfraczek","id":17185347,"node_id":"MDQ6VXNlcjE3MTg1MzQ3","avatar_url":"https://avatars1.githubusercontent.com/u/17185347?v=4","gravatar_id":"","url":"https://api.github.com/users/sfraczek","html_url":"https://github.com/sfraczek","followers_url":"https://api.github.com/users/sfraczek/followers","following_url":"https://api.github.com/users/sfraczek/following{/other_user}","gists_url":"https://api.github.com/users/sfraczek/gists{/gist_id}","starred_url":"https://api.github.com/users/sfraczek/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sfraczek/subscriptions","organizations_url":"https://api.github.com/users/sfraczek/orgs","repos_url":"https://api.github.com/users/sfraczek/repos","events_url":"https://api.github.com/users/sfraczek/events{/privacy}","received_events_url":"https://api.github.com/users/sfraczek/received_events","type":"User","site_admin":false},"body":"@Superjomn, I was wondering if you could suggest what patterns should be added to graph_pattern_detector.* and what should be moved to conv_bn_fuse_pass.* files?","created_at":"2018-09-19T09:06:50Z","updated_at":"2018-10-09T07:39:21Z","closed_at":null,"merged_at":null,"merge_commit_sha":"f499ac9d3f4869cd6198a1e9d9035bf0b7282a26","assignee":null,"assignees":[],"requested_reviewers":[{"login":"Superjomn","id":328693,"node_id":"MDQ6VXNlcjMyODY5Mw==","avatar_url":"https://avatars1.githubusercontent.com/u/328693?v=4","gravatar_id":"","url":"https://api.github.com/users/Superjomn","html_url":"https://github.com/Superjomn","followers_url":"https://api.github.com/users/Superjomn/followers","following_url":"https://api.github.com/users/Superjomn/following{/other_user}","gists_url":"https://api.github.com/users/Superjomn/gists{/gist_id}","starred_url":"https://api.github.com/users/Superjomn/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Superjomn/subscriptions","organizations_url":"https://api.github.com/users/Superjomn/orgs","repos_url":"https://api.github.com/users/Superjomn/repos","events_url":"https://api.github.com/users/Superjomn/events{/privacy}","received_events_url":"https://api.github.com/users/Superjomn/received_events","type":"User","site_admin":false},{"login":"Sand3r-","id":4967505,"node_id":"MDQ6VXNlcjQ5Njc1MDU=","avatar_url":"https://avatars3.githubusercontent.com/u/4967505?v=4","gravatar_id":"","url":"https://api.github.com/users/Sand3r-","html_url":"https://github.com/Sand3r-","followers_url":"https://api.github.com/users/Sand3r-/followers","following_url":"https://api.github.com/users/Sand3r-/following{/other_user}","gists_url":"https://api.github.com/users/Sand3r-/gists{/gist_id}","starred_url":"https://api.github.com/users/Sand3r-/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Sand3r-/subscriptions","organizations_url":"https://api.github.com/users/Sand3r-/orgs","repos_url":"https://api.github.com/users/Sand3r-/repos","events_url":"https://api.github.com/users/Sand3r-/events{/privacy}","received_events_url":"https://api.github.com/users/Sand3r-/received_events","type":"User","site_admin":false},{"login":"jczaja","id":15085062,"node_id":"MDQ6VXNlcjE1MDg1MDYy","avatar_url":"https://avatars0.githubusercontent.com/u/15085062?v=4","gravatar_id":"","url":"https://api.github.com/users/jczaja","html_url":"https://github.com/jczaja","followers_url":"https://api.github.com/users/jczaja/followers","following_url":"https://api.github.com/users/jczaja/following{/other_user}","gists_url":"https://api.github.com/users/jczaja/gists{/gist_id}","starred_url":"https://api.github.com/users/jczaja/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jczaja/subscriptions","organizations_url":"https://api.github.com/users/jczaja/orgs","repos_url":"https://api.github.com/users/jczaja/repos","events_url":"https://api.github.com/users/jczaja/events{/privacy}","received_events_url":"https://api.github.com/users/jczaja/received_events","type":"User","site_admin":false},{"login":"wojtuss","id":19307410,"node_id":"MDQ6VXNlcjE5MzA3NDEw","avatar_url":"https://avatars2.githubusercontent.com/u/19307410?v=4","gravatar_id":"","url":"https://api.github.com/users/wojtuss","html_url":"https://github.com/wojtuss","followers_url":"https://api.github.com/users/wojtuss/followers","following_url":"https://api.github.com/users/wojtuss/following{/other_user}","gists_url":"https://api.github.com/users/wojtuss/gists{/gist_id}","starred_url":"https://api.github.com/users/wojtuss/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/wojtuss/subscriptions","organizations_url":"https://api.github.com/users/wojtuss/orgs","repos_url":"https://api.github.com/users/wojtuss/repos","events_url":"https://api.github.com/users/wojtuss/events{/privacy}","received_events_url":"https://api.github.com/users/wojtuss/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[{"id":831909412,"node_id":"MDU6TGFiZWw4MzE5MDk0MTI=","url":"https://api.github.com/repos/PaddlePaddle/Paddle/labels/Intel","name":"Intel","color":"53a9d1","default":false}],"milestone":null,"commits_url":"https://api.github.com/repos/PaddlePaddle/Paddle/pulls/13486/commits","review_comments_url":"https://api.github.com/repos/PaddlePaddle/Paddle/pulls/13486/comments","review_comment_url":"https://api.github.com/repos/PaddlePaddle/Paddle/pulls/comments{/number}","comments_url":"https://api.github.com/repos/PaddlePaddle/Paddle/issues/13486/comments","statuses_url":"https://api.github.com/repos/PaddlePaddle/Paddle/statuses/78f98294c22a189457b9ef85cf89025c1f570d8d","head":{"label":"sfraczek:sfraczek/conv-bn-fuse-pass","ref":"sfraczek/conv-bn-fuse-pass","sha":"78f98294c22a189457b9ef85cf89025c1f570d8d","user":{"login":"sfraczek","id":17185347,"node_id":"MDQ6VXNlcjE3MTg1MzQ3","avatar_url":"https://avatars1.githubusercontent.com/u/17185347?v=4","gravatar_id":"","url":"https://api.github.com/users/sfraczek","html_url":"https://github.com/sfraczek","followers_url":"https://api.github.com/users/sfraczek/followers","following_url":"https://api.github.com/users/sfraczek/following{/other_user}","gists_url":"https://api.github.com/users/sfraczek/gists{/gist_id}","starred_url":"https://api.github.com/users/sfraczek/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sfraczek/subscriptions","organizations_url":"https://api.github.com/users/sfraczek/orgs","repos_url":"https://api.github.com/users/sfraczek/repos","events_url":"https://api.github.com/users/sfraczek/events{/privacy}","received_events_url":"https://api.github.com/users/sfraczek/received_events","type":"User","site_admin":false},"repo":{"id":140574617,"node_id":"MDEwOlJlcG9zaXRvcnkxNDA1NzQ2MTc=","name":"Paddle","full_name":"sfraczek/Paddle","private":false,"owner":{"login":"sfraczek","id":17185347,"node_id":"MDQ6VXNlcjE3MTg1MzQ3","avatar_url":"https://avatars1.githubusercontent.com/u/17185347?v=4","gravatar_id":"","url":"https://api.github.com/users/sfraczek","html_url":"https://github.com/sfraczek","followers_url":"https://api.github.com/users/sfraczek/followers","following_url":"https://api.github.com/users/sfraczek/following{/other_user}","gists_url":"https://api.github.com/users/sfraczek/gists{/gist_id}","starred_url":"https://api.github.com/users/sfraczek/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sfraczek/subscriptions","organizations_url":"https://api.github.com/users/sfraczek/orgs","repos_url":"https://api.github.com/users/sfraczek/repos","events_url":"https://api.github.com/users/sfraczek/events{/privacy}","received_events_url":"https://api.github.com/users/sfraczek/received_events","type":"User","site_admin":false},"html_url":"https://github.com/sfraczek/Paddle","description":"PArallel Distributed Deep LEarning","fork":true,"url":"https://api.github.com/repos/sfraczek/Paddle","forks_url":"https://api.github.com/repos/sfraczek/Paddle/forks","keys_url":"https://api.github.com/repos/sfraczek/Paddle/keys{/key_id}","collaborators_url":"https://api.github.com/repos/sfraczek/Paddle/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/sfraczek/Paddle/teams","hooks_url":"https://api.github.com/repos/sfraczek/Paddle/hooks","issue_events_url":"https://api.github.com/repos/sfraczek/Paddle/issues/events{/number}","events_url":"https://api.github.com/repos/sfraczek/Paddle/events","assignees_url":"https://api.github.com/repos/sfraczek/Paddle/assignees{/user}","branches_url":"https://api.github.com/repos/sfraczek/Paddle/branches{/branch}","tags_url":"https://api.github.com/repos/sfraczek/Paddle/tags","blobs_url":"https://api.github.com/repos/sfraczek/Paddle/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/sfraczek/Paddle/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/sfraczek/Paddle/git/refs{/sha}","trees_url":"https://api.github.com/repos/sfraczek/Paddle/git/trees{/sha}","statuses_url":"https://api.github.com/repos/sfraczek/Paddle/statuses/{sha}","languages_url":"https://api.github.com/repos/sfraczek/Paddle/languages","stargazers_url":"https://api.github.com/repos/sfraczek/Paddle/stargazers","contributors_url":"https://api.github.com/repos/sfraczek/Paddle/contributors","subscribers_url":"https://api.github.com/repos/sfraczek/Paddle/subscribers","subscription_url":"https://api.github.com/repos/sfraczek/Paddle/subscription","commits_url":"https://api.github.com/repos/sfraczek/Paddle/commits{/sha}","git_commits_url":"https://api.github.com/repos/sfraczek/Paddle/git/commits{/sha}","comments_url":"https://api.github.com/repos/sfraczek/Paddle/comments{/number}","issue_comment_url":"https://api.github.com/repos/sfraczek/Paddle/issues/comments{/number}","contents_url":"https://api.github.com/repos/sfraczek/Paddle/contents/{+path}","compare_url":"https://api.github.com/repos/sfraczek/Paddle/compare/{base}...{head}","merges_url":"https://api.github.com/repos/sfraczek/Paddle/merges","archive_url":"https://api.github.com/repos/sfraczek/Paddle/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/sfraczek/Paddle/downloads","issues_url":"https://api.github.com/repos/sfraczek/Paddle/issues{/number}","pulls_url":"https://api.github.com/repos/sfraczek/Paddle/pulls{/number}","milestones_url":"https://api.github.com/repos/sfraczek/Paddle/milestones{/number}","notifications_url":"https://api.github.com/repos/sfraczek/Paddle/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/sfraczek/Paddle/labels{/name}","releases_url":"https://api.github.com/repos/sfraczek/Paddle/releases{/id}","deployments_url":"https://api.github.com/repos/sfraczek/Paddle/deployments","created_at":"2018-07-11T12:51:20Z","updated_at":"2018-09-25T08:34:27Z","pushed_at":"2018-10-08T11:19:06Z","git_url":"git://github.com/sfraczek/Paddle.git","ssh_url":"git@github.com:sfraczek/Paddle.git","clone_url":"https://github.com/sfraczek/Paddle.git","svn_url":"https://github.com/sfraczek/Paddle","homepage":"http://www.paddlepaddle.org/","size":135644,"stargazers_count":0,"watchers_count":0,"language":"C++","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"forks":0,"open_issues":0,"watchers":0,"default_branch":"develop"}},"base":{"label":"PaddlePaddle:develop","ref":"develop","sha":"75bd0f188bde05bdd8b1f9793b64aec682ede131","user":{"login":"PaddlePaddle","id":23534030,"node_id":"MDEyOk9yZ2FuaXphdGlvbjIzNTM0MDMw","avatar_url":"https://avatars3.githubusercontent.com/u/23534030?v=4","gravatar_id":"","url":"https://api.github.com/users/PaddlePaddle","html_url":"https://github.com/PaddlePaddle","followers_url":"https://api.github.com/users/PaddlePaddle/followers","following_url":"https://api.github.com/users/PaddlePaddle/following{/other_user}","gists_url":"https://api.github.com/users/PaddlePaddle/gists{/gist_id}","starred_url":"https://api.github.com/users/PaddlePaddle/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/PaddlePaddle/subscriptions","organizations_url":"https://api.github.com/users/PaddlePaddle/orgs","repos_url":"https://api.github.com/users/PaddlePaddle/repos","events_url":"https://api.github.com/users/PaddlePaddle/events{/privacy}","received_events_url":"https://api.github.com/users/PaddlePaddle/received_events","type":"Organization","site_admin":false},"repo":{"id":65711522,"node_id":"MDEwOlJlcG9zaXRvcnk2NTcxMTUyMg==","name":"Paddle","full_name":"PaddlePaddle/Paddle","private":false,"owner":{"login":"PaddlePaddle","id":23534030,"node_id":"MDEyOk9yZ2FuaXphdGlvbjIzNTM0MDMw","avatar_url":"https://avatars3.githubusercontent.com/u/23534030?v=4","gravatar_id":"","url":"https://api.github.com/users/PaddlePaddle","html_url":"https://github.com/PaddlePaddle","followers_url":"https://api.github.com/users/PaddlePaddle/followers","following_url":"https://api.github.com/users/PaddlePaddle/following{/other_user}","gists_url":"https://api.github.com/users/PaddlePaddle/gists{/gist_id}","starred_url":"https://api.github.com/users/PaddlePaddle/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/PaddlePaddle/subscriptions","organizations_url":"https://api.github.com/users/PaddlePaddle/orgs","repos_url":"https://api.github.com/users/PaddlePaddle/repos","events_url":"https://api.github.com/users/PaddlePaddle/events{/privacy}","received_events_url":"https://api.github.com/users/PaddlePaddle/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/PaddlePaddle/Paddle","description":"PArallel Distributed Deep LEarning","fork":false,"url":"https://api.github.com/repos/PaddlePaddle/Paddle","forks_url":"https://api.github.com/repos/PaddlePaddle/Paddle/forks","keys_url":"https://api.github.com/repos/PaddlePaddle/Paddle/keys{/key_id}","collaborators_url":"https://api.github.com/repos/PaddlePaddle/Paddle/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/PaddlePaddle/Paddle/teams","hooks_url":"https://api.github.com/repos/PaddlePaddle/Paddle/hooks","issue_events_url":"https://api.github.com/repos/PaddlePaddle/Paddle/issues/events{/number}","events_url":"https://api.github.com/repos/PaddlePaddle/Paddle/events","assignees_url":"https://api.github.com/repos/PaddlePaddle/Paddle/assignees{/user}","branches_url":"https://api.github.com/repos/PaddlePaddle/Paddle/branches{/branch}","tags_url":"https://api.github.com/repos/PaddlePaddle/Paddle/tags","blobs_url":"https://api.github.com/repos/PaddlePaddle/Paddle/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/PaddlePaddle/Paddle/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/PaddlePaddle/Paddle/git/refs{/sha}","trees_url":"https://api.github.com/repos/PaddlePaddle/Paddle/git/trees{/sha}","statuses_url":"https://api.github.com/repos/PaddlePaddle/Paddle/statuses/{sha}","languages_url":"https://api.github.com/repos/PaddlePaddle/Paddle/languages","stargazers_url":"https://api.github.com/repos/PaddlePaddle/Paddle/stargazers","contributors_url":"https://api.github.com/repos/PaddlePaddle/Paddle/contributors","subscribers_url":"https://api.github.com/repos/PaddlePaddle/Paddle/subscribers","subscription_url":"https://api.github.com/repos/PaddlePaddle/Paddle/subscription","commits_url":"https://api.github.com/repos/PaddlePaddle/Paddle/commits{/sha}","git_commits_url":"https://api.github.com/repos/PaddlePaddle/Paddle/git/commits{/sha}","comments_url":"https://api.github.com/repos/PaddlePaddle/Paddle/comments{/number}","issue_comment_url":"https://api.github.com/repos/PaddlePaddle/Paddle/issues/comments{/number}","contents_url":"https://api.github.com/repos/PaddlePaddle/Paddle/contents/{+path}","compare_url":"https://api.github.com/repos/PaddlePaddle/Paddle/compare/{base}...{head}","merges_url":"https://api.github.com/repos/PaddlePaddle/Paddle/merges","archive_url":"https://api.github.com/repos/PaddlePaddle/Paddle/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/PaddlePaddle/Paddle/downloads","issues_url":"https://api.github.com/repos/PaddlePaddle/Paddle/issues{/number}","pulls_url":"https://api.github.com/repos/PaddlePaddle/Paddle/pulls{/number}","milestones_url":"https://api.github.com/repos/PaddlePaddle/Paddle/milestones{/number}","notifications_url":"https://api.github.com/repos/PaddlePaddle/Paddle/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/PaddlePaddle/Paddle/labels{/name}","releases_url":"https://api.github.com/repos/PaddlePaddle/Paddle/releases{/id}","deployments_url":"https://api.github.com/repos/PaddlePaddle/Paddle/deployments","created_at":"2016-08-15T06:59:08Z","updated_at":"2018-10-09T06:33:02Z","pushed_at":"2018-10-09T07:26:34Z","git_url":"git://github.com/PaddlePaddle/Paddle.git","ssh_url":"git@github.com:PaddlePaddle/Paddle.git","clone_url":"https://github.com/PaddlePaddle/Paddle.git","svn_url":"https://github.com/PaddlePaddle/Paddle","homepage":"http://www.paddlepaddle.org/","size":136461,"stargazers_count":7593,"watchers_count":7593,"language":"C++","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":2075,"mirror_url":null,"archived":false,"open_issues_count":695,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"forks":2075,"open_issues":695,"watchers":7593,"default_branch":"develop"}},"_links":{"self":{"href":"https://api.github.com/repos/PaddlePaddle/Paddle/pulls/13486"},"html":{"href":"https://github.com/PaddlePaddle/Paddle/pull/13486"},"issue":{"href":"https://api.github.com/repos/PaddlePaddle/Paddle/issues/13486"},"comments":{"href":"https://api.github.com/repos/PaddlePaddle/Paddle/issues/13486/comments"},"review_comments":{"href":"https://api.github.com/repos/PaddlePaddle/Paddle/pulls/13486/comments"},"review_comment":{"href":"https://api.github.com/repos/PaddlePaddle/Paddle/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/PaddlePaddle/Paddle/pulls/13486/commits"},"statuses":{"href":"https://api.github.com/repos/PaddlePaddle/Paddle/statuses/78f98294c22a189457b9ef85cf89025c1f570d8d"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"luotao1"}}