{"action":"created","comment":{"url":"https://api.github.com/repos/tensorflow/tensorflow/pulls/comments/133039454","pull_request_review_id":56177155,"id":133039454,"diff_hunk":"@@ -0,0 +1,53 @@\n+# Copyright 2015 The TensorFlow 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+\"\"\"Tests for device function for model_averageted training.\"\"\"","path":"tensorflow/contrib/opt/python/training/model_average_device_setter_test.py","position":15,"original_position":15,"commit_id":"9f7b2fe99e5d63ae14f03d0ab02bbe3839d6021a","original_commit_id":"9f7b2fe99e5d63ae14f03d0ab02bbe3839d6021a","user":{"login":"ry","id":80,"avatar_url":"https://avatars1.githubusercontent.com/u/80?v=4","gravatar_id":"","url":"https://api.github.com/users/ry","html_url":"https://github.com/ry","followers_url":"https://api.github.com/users/ry/followers","following_url":"https://api.github.com/users/ry/following{/other_user}","gists_url":"https://api.github.com/users/ry/gists{/gist_id}","starred_url":"https://api.github.com/users/ry/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ry/subscriptions","organizations_url":"https://api.github.com/users/ry/orgs","repos_url":"https://api.github.com/users/ry/repos","events_url":"https://api.github.com/users/ry/events{/privacy}","received_events_url":"https://api.github.com/users/ry/received_events","type":"User","site_admin":false},"body":"No need for separate file - put this into `model_average_optimizer_test.py`","created_at":"2017-08-14T19:26:58Z","updated_at":"2017-08-14T19:46:42Z","html_url":"https://github.com/tensorflow/tensorflow/pull/11581#discussion_r133039454","pull_request_url":"https://api.github.com/repos/tensorflow/tensorflow/pulls/11581","_links":{"self":{"href":"https://api.github.com/repos/tensorflow/tensorflow/pulls/comments/133039454"},"html":{"href":"https://github.com/tensorflow/tensorflow/pull/11581#discussion_r133039454"},"pull_request":{"href":"https://api.github.com/repos/tensorflow/tensorflow/pulls/11581"}}},"pull_request":{"url":"https://api.github.com/repos/tensorflow/tensorflow/pulls/11581","id":131094660,"html_url":"https://github.com/tensorflow/tensorflow/pull/11581","diff_url":"https://github.com/tensorflow/tensorflow/pull/11581.diff","patch_url":"https://github.com/tensorflow/tensorflow/pull/11581.patch","issue_url":"https://api.github.com/repos/tensorflow/tensorflow/issues/11581","number":11581,"state":"open","locked":false,"title":"Model average replicas optimizer","user":{"login":"abenmao","id":29789552,"avatar_url":"https://avatars0.githubusercontent.com/u/29789552?v=4","gravatar_id":"","url":"https://api.github.com/users/abenmao","html_url":"https://github.com/abenmao","followers_url":"https://api.github.com/users/abenmao/followers","following_url":"https://api.github.com/users/abenmao/following{/other_user}","gists_url":"https://api.github.com/users/abenmao/gists{/gist_id}","starred_url":"https://api.github.com/users/abenmao/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/abenmao/subscriptions","organizations_url":"https://api.github.com/users/abenmao/orgs","repos_url":"https://api.github.com/users/abenmao/repos","events_url":"https://api.github.com/users/abenmao/events{/privacy}","received_events_url":"https://api.github.com/users/abenmao/received_events","type":"User","site_admin":false},"body":"We have implemented a new replicas_optimizer \"ModelAverageOptimizer\" to reduce cross-node communication cost. It is mentioned in the following issue:\r\n\r\nhttps://github.com/tensorflow/tensorflow/issues/10449\r\n\r\n# Model Average\r\n\r\nIn a typical synchronous training environment (N-replica synchronous training), gradients will be averaged each step, and then applied to the variables, after that replicas can fetch the new variables and continue. However, in a model-average training environment, model parameters will be averaged every 'ma_intervals' steps. In the interval between two \"average operation\", each worker trained its local model, there are no data transfer at all between workers or ps, which can significantly accerlate parallel training.\r\n\r\nReference:  https://arxiv.org/pdf/1410.7455v8.pdf\r\n\r\n\r\n## BMUF\r\n\r\nReference:  http://www.microsoft.com/en-us/research/wp-content/uploads/2016/08/0005880.pdf\r\n\r\nBMUF brings in 'Momentum' and can also work with a Nesterov momentum scheme on the based of Model Average method.\r\n\r\nblock\\_momentum\\_rate: It brings in the historical blockwise gradients. The block momentum is usually set according to the number of workers: block\\_momentum = 1.0 - 1.0/num_of_workers. The default value is 0.0. When using default value, the naive ModelAverage method is applied, the original learning rate of local optimizer should be multiply by num_of_workers. While when the value is (0.0,1.0), the BMUF method is applied, the learning rate of local optimizer can be unchanged.\r\n\r\nuse\\_Nesterov: means the Nesterov-style momentum update is applied on the block level. The default value is true. This can accelerate training with non-zero block_momentum_rate.\r\n\r\nblock\\_learning\\_rate: block\\_learning\\_rate is always 1.0 or slightly higher than 1.0.\r\n\r\n```python             \r\n  def __init__(self,\r\n               replicas_to_aggregate,                                                                 \r\n               ma_intervals,\r\n               total_num_replicas=None,\r\n               block_momentum_rate=0.0,\r\n               use_Nesterov=True,\r\n               block_learning_rate=1.0):\r\n    \"\"\"Construct a model_average optimizer.\r\n```\r\n\r\n# Result\r\nWe have benchmarked it on several in-house models, the results showed a good convergence speedup and training-data processing almostly reaches linear speedup.\r\n\r\n| device config (GPU M40)\t| convergence speed-up | computation speed-up |\r\n|---|---|---|\r\n|4 GPUs within 2 nodes|3.4|3.9|\r\n|8 GPUs within 4 nodes|5.7|7.5|\r\n|16 GPUs within 8 nodes|9.2|14.6|\r\n\r\nAlso，we made a experiment with ResNet on cifar10 (baseline code is from: https://github.com/tensorflow/models/tree/master/resnet):\r\n\r\n| device config (GPU P100)\t| convergence speed-up |\r\n|---|---|\r\n|2 GPUs within 1 nodes|2.03|\r\n|4 GPUs within 1 nodes|3.67|\r\n|8 GPUs within 1 nodes|6.57|\r\n\r\n# API\r\nBy now, it is implemented as a tensorflow API using Python， doesn't have to change the core/distributed runtime code.\r\n\r\n\r\n```python  \r\n  # Create any optimizer to update the variables, say a simple SGD:\r\n  opt = GradientDescentOptimizer(learning_rate=0.1)\r\n             \r\n  # Create a ModelAverageOptimizer to update the global variables:\r\n  ma = tf.contrib.model_average.ModelAverageOptimizer(replicas_to_aggregate=50, \r\n                                                      ma_intervals=100)\r\n             \r\n  # create the hook which handles model average operations.\r\n  ma_replicas_hook = ma.make_ma_run_hook()\r\n  # And also, create the hook which handles initialization and queues.\r\n  ma_hook = ma.make_session_run_hook(is_chief)\r\n```\r\n  \r\n\r\nThanks.","created_at":"2017-07-18T13:59:11Z","updated_at":"2017-08-14T19:46:42Z","closed_at":null,"merged_at":null,"merge_commit_sha":"225d22e77ff9c783c0b17cf64607a2e2c0a04812","assignee":{"login":"ry","id":80,"avatar_url":"https://avatars1.githubusercontent.com/u/80?v=4","gravatar_id":"","url":"https://api.github.com/users/ry","html_url":"https://github.com/ry","followers_url":"https://api.github.com/users/ry/followers","following_url":"https://api.github.com/users/ry/following{/other_user}","gists_url":"https://api.github.com/users/ry/gists{/gist_id}","starred_url":"https://api.github.com/users/ry/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ry/subscriptions","organizations_url":"https://api.github.com/users/ry/orgs","repos_url":"https://api.github.com/users/ry/repos","events_url":"https://api.github.com/users/ry/events{/privacy}","received_events_url":"https://api.github.com/users/ry/received_events","type":"User","site_admin":false},"assignees":[{"login":"ry","id":80,"avatar_url":"https://avatars1.githubusercontent.com/u/80?v=4","gravatar_id":"","url":"https://api.github.com/users/ry","html_url":"https://github.com/ry","followers_url":"https://api.github.com/users/ry/followers","following_url":"https://api.github.com/users/ry/following{/other_user}","gists_url":"https://api.github.com/users/ry/gists{/gist_id}","starred_url":"https://api.github.com/users/ry/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ry/subscriptions","organizations_url":"https://api.github.com/users/ry/orgs","repos_url":"https://api.github.com/users/ry/repos","events_url":"https://api.github.com/users/ry/events{/privacy}","received_events_url":"https://api.github.com/users/ry/received_events","type":"User","site_admin":false},{"login":"vrv","id":463737,"avatar_url":"https://avatars0.githubusercontent.com/u/463737?v=4","gravatar_id":"","url":"https://api.github.com/users/vrv","html_url":"https://github.com/vrv","followers_url":"https://api.github.com/users/vrv/followers","following_url":"https://api.github.com/users/vrv/following{/other_user}","gists_url":"https://api.github.com/users/vrv/gists{/gist_id}","starred_url":"https://api.github.com/users/vrv/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/vrv/subscriptions","organizations_url":"https://api.github.com/users/vrv/orgs","repos_url":"https://api.github.com/users/vrv/repos","events_url":"https://api.github.com/users/vrv/events{/privacy}","received_events_url":"https://api.github.com/users/vrv/received_events","type":"User","site_admin":false}],"requested_reviewers":[{"login":"mrry","id":192142,"avatar_url":"https://avatars1.githubusercontent.com/u/192142?v=4","gravatar_id":"","url":"https://api.github.com/users/mrry","html_url":"https://github.com/mrry","followers_url":"https://api.github.com/users/mrry/followers","following_url":"https://api.github.com/users/mrry/following{/other_user}","gists_url":"https://api.github.com/users/mrry/gists{/gist_id}","starred_url":"https://api.github.com/users/mrry/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mrry/subscriptions","organizations_url":"https://api.github.com/users/mrry/orgs","repos_url":"https://api.github.com/users/mrry/repos","events_url":"https://api.github.com/users/mrry/events{/privacy}","received_events_url":"https://api.github.com/users/mrry/received_events","type":"User","site_admin":false},{"login":"benoitsteiner","id":6969686,"avatar_url":"https://avatars0.githubusercontent.com/u/6969686?v=4","gravatar_id":"","url":"https://api.github.com/users/benoitsteiner","html_url":"https://github.com/benoitsteiner","followers_url":"https://api.github.com/users/benoitsteiner/followers","following_url":"https://api.github.com/users/benoitsteiner/following{/other_user}","gists_url":"https://api.github.com/users/benoitsteiner/gists{/gist_id}","starred_url":"https://api.github.com/users/benoitsteiner/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/benoitsteiner/subscriptions","organizations_url":"https://api.github.com/users/benoitsteiner/orgs","repos_url":"https://api.github.com/users/benoitsteiner/repos","events_url":"https://api.github.com/users/benoitsteiner/events{/privacy}","received_events_url":"https://api.github.com/users/benoitsteiner/received_events","type":"User","site_admin":false}],"milestone":null,"commits_url":"https://api.github.com/repos/tensorflow/tensorflow/pulls/11581/commits","review_comments_url":"https://api.github.com/repos/tensorflow/tensorflow/pulls/11581/comments","review_comment_url":"https://api.github.com/repos/tensorflow/tensorflow/pulls/comments{/number}","comments_url":"https://api.github.com/repos/tensorflow/tensorflow/issues/11581/comments","statuses_url":"https://api.github.com/repos/tensorflow/tensorflow/statuses/9f7b2fe99e5d63ae14f03d0ab02bbe3839d6021a","head":{"label":"abenmao:ModelAverageReplicasOptimizer","ref":"ModelAverageReplicasOptimizer","sha":"9f7b2fe99e5d63ae14f03d0ab02bbe3839d6021a","user":{"login":"abenmao","id":29789552,"avatar_url":"https://avatars0.githubusercontent.com/u/29789552?v=4","gravatar_id":"","url":"https://api.github.com/users/abenmao","html_url":"https://github.com/abenmao","followers_url":"https://api.github.com/users/abenmao/followers","following_url":"https://api.github.com/users/abenmao/following{/other_user}","gists_url":"https://api.github.com/users/abenmao/gists{/gist_id}","starred_url":"https://api.github.com/users/abenmao/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/abenmao/subscriptions","organizations_url":"https://api.github.com/users/abenmao/orgs","repos_url":"https://api.github.com/users/abenmao/repos","events_url":"https://api.github.com/users/abenmao/events{/privacy}","received_events_url":"https://api.github.com/users/abenmao/received_events","type":"User","site_admin":false},"repo":{"id":96268300,"name":"tensorflow","full_name":"abenmao/tensorflow","owner":{"login":"abenmao","id":29789552,"avatar_url":"https://avatars0.githubusercontent.com/u/29789552?v=4","gravatar_id":"","url":"https://api.github.com/users/abenmao","html_url":"https://github.com/abenmao","followers_url":"https://api.github.com/users/abenmao/followers","following_url":"https://api.github.com/users/abenmao/following{/other_user}","gists_url":"https://api.github.com/users/abenmao/gists{/gist_id}","starred_url":"https://api.github.com/users/abenmao/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/abenmao/subscriptions","organizations_url":"https://api.github.com/users/abenmao/orgs","repos_url":"https://api.github.com/users/abenmao/repos","events_url":"https://api.github.com/users/abenmao/events{/privacy}","received_events_url":"https://api.github.com/users/abenmao/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/abenmao/tensorflow","description":"Computation using data flow graphs for scalable machine learning","fork":true,"url":"https://api.github.com/repos/abenmao/tensorflow","forks_url":"https://api.github.com/repos/abenmao/tensorflow/forks","keys_url":"https://api.github.com/repos/abenmao/tensorflow/keys{/key_id}","collaborators_url":"https://api.github.com/repos/abenmao/tensorflow/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/abenmao/tensorflow/teams","hooks_url":"https://api.github.com/repos/abenmao/tensorflow/hooks","issue_events_url":"https://api.github.com/repos/abenmao/tensorflow/issues/events{/number}","events_url":"https://api.github.com/repos/abenmao/tensorflow/events","assignees_url":"https://api.github.com/repos/abenmao/tensorflow/assignees{/user}","branches_url":"https://api.github.com/repos/abenmao/tensorflow/branches{/branch}","tags_url":"https://api.github.com/repos/abenmao/tensorflow/tags","blobs_url":"https://api.github.com/repos/abenmao/tensorflow/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/abenmao/tensorflow/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/abenmao/tensorflow/git/refs{/sha}","trees_url":"https://api.github.com/repos/abenmao/tensorflow/git/trees{/sha}","statuses_url":"https://api.github.com/repos/abenmao/tensorflow/statuses/{sha}","languages_url":"https://api.github.com/repos/abenmao/tensorflow/languages","stargazers_url":"https://api.github.com/repos/abenmao/tensorflow/stargazers","contributors_url":"https://api.github.com/repos/abenmao/tensorflow/contributors","subscribers_url":"https://api.github.com/repos/abenmao/tensorflow/subscribers","subscription_url":"https://api.github.com/repos/abenmao/tensorflow/subscription","commits_url":"https://api.github.com/repos/abenmao/tensorflow/commits{/sha}","git_commits_url":"https://api.github.com/repos/abenmao/tensorflow/git/commits{/sha}","comments_url":"https://api.github.com/repos/abenmao/tensorflow/comments{/number}","issue_comment_url":"https://api.github.com/repos/abenmao/tensorflow/issues/comments{/number}","contents_url":"https://api.github.com/repos/abenmao/tensorflow/contents/{+path}","compare_url":"https://api.github.com/repos/abenmao/tensorflow/compare/{base}...{head}","merges_url":"https://api.github.com/repos/abenmao/tensorflow/merges","archive_url":"https://api.github.com/repos/abenmao/tensorflow/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/abenmao/tensorflow/downloads","issues_url":"https://api.github.com/repos/abenmao/tensorflow/issues{/number}","pulls_url":"https://api.github.com/repos/abenmao/tensorflow/pulls{/number}","milestones_url":"https://api.github.com/repos/abenmao/tensorflow/milestones{/number}","notifications_url":"https://api.github.com/repos/abenmao/tensorflow/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/abenmao/tensorflow/labels{/name}","releases_url":"https://api.github.com/repos/abenmao/tensorflow/releases{/id}","deployments_url":"https://api.github.com/repos/abenmao/tensorflow/deployments","created_at":"2017-07-05T02:22:36Z","updated_at":"2017-07-05T02:23:02Z","pushed_at":"2017-08-10T11:12:01Z","git_url":"git://github.com/abenmao/tensorflow.git","ssh_url":"git@github.com:abenmao/tensorflow.git","clone_url":"https://github.com/abenmao/tensorflow.git","svn_url":"https://github.com/abenmao/tensorflow","homepage":"http://tensorflow.org","size":112973,"stargazers_count":0,"watchers_count":0,"language":"C++","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"tensorflow:master","ref":"master","sha":"dd06643cf098ed362212ce0f76ee746951466e81","user":{"login":"tensorflow","id":15658638,"avatar_url":"https://avatars1.githubusercontent.com/u/15658638?v=4","gravatar_id":"","url":"https://api.github.com/users/tensorflow","html_url":"https://github.com/tensorflow","followers_url":"https://api.github.com/users/tensorflow/followers","following_url":"https://api.github.com/users/tensorflow/following{/other_user}","gists_url":"https://api.github.com/users/tensorflow/gists{/gist_id}","starred_url":"https://api.github.com/users/tensorflow/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/tensorflow/subscriptions","organizations_url":"https://api.github.com/users/tensorflow/orgs","repos_url":"https://api.github.com/users/tensorflow/repos","events_url":"https://api.github.com/users/tensorflow/events{/privacy}","received_events_url":"https://api.github.com/users/tensorflow/received_events","type":"Organization","site_admin":false},"repo":{"id":45717250,"name":"tensorflow","full_name":"tensorflow/tensorflow","owner":{"login":"tensorflow","id":15658638,"avatar_url":"https://avatars1.githubusercontent.com/u/15658638?v=4","gravatar_id":"","url":"https://api.github.com/users/tensorflow","html_url":"https://github.com/tensorflow","followers_url":"https://api.github.com/users/tensorflow/followers","following_url":"https://api.github.com/users/tensorflow/following{/other_user}","gists_url":"https://api.github.com/users/tensorflow/gists{/gist_id}","starred_url":"https://api.github.com/users/tensorflow/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/tensorflow/subscriptions","organizations_url":"https://api.github.com/users/tensorflow/orgs","repos_url":"https://api.github.com/users/tensorflow/repos","events_url":"https://api.github.com/users/tensorflow/events{/privacy}","received_events_url":"https://api.github.com/users/tensorflow/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/tensorflow/tensorflow","description":"Computation using data flow graphs for scalable machine learning","fork":false,"url":"https://api.github.com/repos/tensorflow/tensorflow","forks_url":"https://api.github.com/repos/tensorflow/tensorflow/forks","keys_url":"https://api.github.com/repos/tensorflow/tensorflow/keys{/key_id}","collaborators_url":"https://api.github.com/repos/tensorflow/tensorflow/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/tensorflow/tensorflow/teams","hooks_url":"https://api.github.com/repos/tensorflow/tensorflow/hooks","issue_events_url":"https://api.github.com/repos/tensorflow/tensorflow/issues/events{/number}","events_url":"https://api.github.com/repos/tensorflow/tensorflow/events","assignees_url":"https://api.github.com/repos/tensorflow/tensorflow/assignees{/user}","branches_url":"https://api.github.com/repos/tensorflow/tensorflow/branches{/branch}","tags_url":"https://api.github.com/repos/tensorflow/tensorflow/tags","blobs_url":"https://api.github.com/repos/tensorflow/tensorflow/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/tensorflow/tensorflow/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/tensorflow/tensorflow/git/refs{/sha}","trees_url":"https://api.github.com/repos/tensorflow/tensorflow/git/trees{/sha}","statuses_url":"https://api.github.com/repos/tensorflow/tensorflow/statuses/{sha}","languages_url":"https://api.github.com/repos/tensorflow/tensorflow/languages","stargazers_url":"https://api.github.com/repos/tensorflow/tensorflow/stargazers","contributors_url":"https://api.github.com/repos/tensorflow/tensorflow/contributors","subscribers_url":"https://api.github.com/repos/tensorflow/tensorflow/subscribers","subscription_url":"https://api.github.com/repos/tensorflow/tensorflow/subscription","commits_url":"https://api.github.com/repos/tensorflow/tensorflow/commits{/sha}","git_commits_url":"https://api.github.com/repos/tensorflow/tensorflow/git/commits{/sha}","comments_url":"https://api.github.com/repos/tensorflow/tensorflow/comments{/number}","issue_comment_url":"https://api.github.com/repos/tensorflow/tensorflow/issues/comments{/number}","contents_url":"https://api.github.com/repos/tensorflow/tensorflow/contents/{+path}","compare_url":"https://api.github.com/repos/tensorflow/tensorflow/compare/{base}...{head}","merges_url":"https://api.github.com/repos/tensorflow/tensorflow/merges","archive_url":"https://api.github.com/repos/tensorflow/tensorflow/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/tensorflow/tensorflow/downloads","issues_url":"https://api.github.com/repos/tensorflow/tensorflow/issues{/number}","pulls_url":"https://api.github.com/repos/tensorflow/tensorflow/pulls{/number}","milestones_url":"https://api.github.com/repos/tensorflow/tensorflow/milestones{/number}","notifications_url":"https://api.github.com/repos/tensorflow/tensorflow/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/tensorflow/tensorflow/labels{/name}","releases_url":"https://api.github.com/repos/tensorflow/tensorflow/releases{/id}","deployments_url":"https://api.github.com/repos/tensorflow/tensorflow/deployments","created_at":"2015-11-07T01:19:20Z","updated_at":"2017-08-14T19:30:38Z","pushed_at":"2017-08-14T19:29:11Z","git_url":"git://github.com/tensorflow/tensorflow.git","ssh_url":"git@github.com:tensorflow/tensorflow.git","clone_url":"https://github.com/tensorflow/tensorflow.git","svn_url":"https://github.com/tensorflow/tensorflow","homepage":"http://tensorflow.org","size":118918,"stargazers_count":66794,"watchers_count":66794,"language":"C++","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":32719,"mirror_url":null,"open_issues_count":1014,"forks":32719,"open_issues":1014,"watchers":66794,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/tensorflow/tensorflow/pulls/11581"},"html":{"href":"https://github.com/tensorflow/tensorflow/pull/11581"},"issue":{"href":"https://api.github.com/repos/tensorflow/tensorflow/issues/11581"},"comments":{"href":"https://api.github.com/repos/tensorflow/tensorflow/issues/11581/comments"},"review_comments":{"href":"https://api.github.com/repos/tensorflow/tensorflow/pulls/11581/comments"},"review_comment":{"href":"https://api.github.com/repos/tensorflow/tensorflow/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/tensorflow/tensorflow/pulls/11581/commits"},"statuses":{"href":"https://api.github.com/repos/tensorflow/tensorflow/statuses/9f7b2fe99e5d63ae14f03d0ab02bbe3839d6021a"}}}}
{"actor":{"display_login":"ry"}}