{"action":"created","comment":{"url":"https://api.github.com/repos/dmlc/gluon-nlp/pulls/comments/239102108","pull_request_review_id":181802538,"id":239102108,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIzOTEwMjEwOA==","diff_hunk":"@@ -0,0 +1,151 @@\n+# coding: utf-8\n+\n+# Licensed to the Apache Software Foundation (ASF) under one\n+# or more contributor license agreements.  See the NOTICE file\n+# distributed with this work for additional information\n+# regarding copyright ownership.  The ASF licenses this file\n+# to you under the Apache License, Version 2.0 (the\n+# \"License\"); you may not use this file except in compliance\n+# with the License.  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,\n+# software distributed under the License is distributed on an\n+# \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n+# KIND, either express or implied.  See the License for the\n+# specific language governing permissions and limitations\n+# under the License.\n+\"\"\"Utility functions for parallel processing.\"\"\"\n+import threading\n+try:\n+    import Queue as queue\n+except ImportError:\n+    import queue\n+\n+__all__ = ['Parallelizable', 'Parallel']\n+\n+class Parallelizable(object):\n+    \"\"\" Base class for parallelizable unit of work, which can be invoked by `Parallel`.\n+    The subclass must implement the `forward_backward` method, and be used\n+    together with `Parallel`. For example::\n+\n+        class ParallelNet(Parallelizable):\n+            def __init__(self):\n+                self._net = Model()\n+                self._loss = gluon.loss.SoftmaxCrossEntropyLoss()\n+\n+            def forward_backward(self, x):\n+                data, label = x\n+                with mx.autograd.record():\n+                    out = self._net(data)\n+                    loss = self._loss(out, label)\n+                loss.backward()\n+                return loss\n+\n+        net = ParallelNet()\n+        ctx = [mx.gpu(0), mx.gpu(1)]\n+        parallel = Parallel(len(ctx), net)\n+        # Gluon block is initialized after forwarding the first batch\n+        initialized = False\n+\n+        for batch in batches:\n+            for x in gluon.utils.split_and_load(batch, ctx):\n+                parallel.put(x)\n+            losses = [parallel.get() for _ in ctx]\n+            trainer.step()\n+    \"\"\"\n+    def forward_backward(self, x):\n+        \"\"\" Forward and backward computation. \"\"\"\n+        raise NotImplementedError()\n+\n+class Parallel(object):\n+    \"\"\" Class for parallel processing with `Parallelizable`s. It invokes a\n+    `Parallelizable` with multiple Python threads. For example::\n+\n+        class ParallelNet(Parallelizable):\n+            def __init__(self):\n+                self._net = Model()\n+                self._loss = gluon.loss.SoftmaxCrossEntropyLoss()\n+\n+            def forward_backward(self, x):\n+                data, label = x\n+                mx.autograd.record():\n+                    out = self._net(data)\n+                    loss = self._loss(out, label)\n+                loss.backward()\n+                return loss\n+\n+        net = ParallelNet()\n+        ctx = [mx.gpu(0), mx.gpu(1)]\n+        parallel = Parallel(len(ctx), net)\n+\n+        for batch in batches:\n+            for x in gluon.utils.split_and_load(batch, ctx):\n+                parallel.put(x)\n+            losses = [parallel.get() for _ in ctx]\n+            trainer.step()\n+\n+    Parameters\n+    ----------\n+    num_workers : int\n+        Number of worker threads.\n+    parallelizable :\n+        Parallelizable net whose `forward` and `backward` methods are invoked\n+        by multiple worker threads.\n+    serial_init : bool, default True\n+        Execute the first `num_workers` inputs in main thread, so that the `Block`\n+        used in `parallizable` is initialized serially. Initialize a `Block` with\n+        multiple threads may cause unexpected behavior.\n+    \"\"\"\n+\n+    class _StopSignal(object):\n+        \"\"\" Internal class to signal stop. \"\"\"\n+        def __init__(self, msg):\n+            self._msg = msg\n+\n+    def __init__(self, num_workers, parallizable, serial_init=True):\n+        self._in_queue = queue.Queue(-1)\n+        self._out_queue = queue.Queue(-1)\n+        self._num_workers = num_workers\n+        assert self._num_workers > 0, 'num_workers must be positive'\n+        self._threads = []\n+        self._parallizable = parallizable\n+        self._num_serial = num_workers if serial_init else 0\n+\n+        def _worker(in_queue, out_queue, parallel):\n+            while True:\n+                x = in_queue.get()\n+                if isinstance(x, Parallel._StopSignal):\n+                    return\n+                out = parallel.forward_backward(x)\n+                out_queue.put(out)\n+\n+        arg = (self._in_queue, self._out_queue, self._parallizable)\n+        for _ in range(num_workers):\n+            thread = threading.Thread(target=_worker, args=arg)\n+            self._threads.append(thread)\n+            thread.start()\n+\n+    def put(self, x):\n+        \"\"\" Assign input `x` to an available worker and invoke\n+        `parallizable.forward_backward` with x. \"\"\"","path":"src/gluonnlp/utils/parallel.py","position":132,"original_position":132,"commit_id":"b5ed642fd2879a04a0d5347bcba13508193483e3","original_commit_id":"b5ed642fd2879a04a0d5347bcba13508193483e3","user":{"login":"leezu","id":946903,"node_id":"MDQ6VXNlcjk0NjkwMw==","avatar_url":"https://avatars1.githubusercontent.com/u/946903?v=4","gravatar_id":"","url":"https://api.github.com/users/leezu","html_url":"https://github.com/leezu","followers_url":"https://api.github.com/users/leezu/followers","following_url":"https://api.github.com/users/leezu/following{/other_user}","gists_url":"https://api.github.com/users/leezu/gists{/gist_id}","starred_url":"https://api.github.com/users/leezu/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/leezu/subscriptions","organizations_url":"https://api.github.com/users/leezu/orgs","repos_url":"https://api.github.com/users/leezu/repos","events_url":"https://api.github.com/users/leezu/events{/privacy}","received_events_url":"https://api.github.com/users/leezu/received_events","type":"User","site_admin":false},"body":"PEP 257 https://www.python.org/dev/peps/pep-0257/","created_at":"2018-12-05T15:06:26Z","updated_at":"2018-12-05T15:06:27Z","html_url":"https://github.com/dmlc/gluon-nlp/pull/387#discussion_r239102108","pull_request_url":"https://api.github.com/repos/dmlc/gluon-nlp/pulls/387","author_association":"COLLABORATOR","_links":{"self":{"href":"https://api.github.com/repos/dmlc/gluon-nlp/pulls/comments/239102108"},"html":{"href":"https://github.com/dmlc/gluon-nlp/pull/387#discussion_r239102108"},"pull_request":{"href":"https://api.github.com/repos/dmlc/gluon-nlp/pulls/387"}}},"pull_request":{"url":"https://api.github.com/repos/dmlc/gluon-nlp/pulls/387","id":227157685,"node_id":"MDExOlB1bGxSZXF1ZXN0MjI3MTU3Njg1","html_url":"https://github.com/dmlc/gluon-nlp/pull/387","diff_url":"https://github.com/dmlc/gluon-nlp/pull/387.diff","patch_url":"https://github.com/dmlc/gluon-nlp/pull/387.patch","issue_url":"https://api.github.com/repos/dmlc/gluon-nlp/issues/387","number":387,"state":"open","locked":false,"title":"add data parallel for transformer","user":{"login":"eric-haibin-lin","id":5545640,"node_id":"MDQ6VXNlcjU1NDU2NDA=","avatar_url":"https://avatars1.githubusercontent.com/u/5545640?v=4","gravatar_id":"","url":"https://api.github.com/users/eric-haibin-lin","html_url":"https://github.com/eric-haibin-lin","followers_url":"https://api.github.com/users/eric-haibin-lin/followers","following_url":"https://api.github.com/users/eric-haibin-lin/following{/other_user}","gists_url":"https://api.github.com/users/eric-haibin-lin/gists{/gist_id}","starred_url":"https://api.github.com/users/eric-haibin-lin/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/eric-haibin-lin/subscriptions","organizations_url":"https://api.github.com/users/eric-haibin-lin/orgs","repos_url":"https://api.github.com/users/eric-haibin-lin/repos","events_url":"https://api.github.com/users/eric-haibin-lin/events{/privacy}","received_events_url":"https://api.github.com/users/eric-haibin-lin/received_events","type":"User","site_admin":false},"body":"## Description ##\r\nAdd a python multi-thread forward utility, applied to transformer. Throughput:\r\n- previous: 110K/s\r\n- now: 160K/s\r\n\r\n@szhengac @szha @bikestra @hhexiy @leezu \r\n\r\nNote that the Gluon blocks still need to be initialized using a single thread (by forwarding with a batch)... The interface is not ideal but at least works. \r\n\r\n## Checklist ##\r\n### Essentials ###\r\n- [ ] Changes are complete (i.e. I finished coding on this PR)\r\n- [ ] All changes have test coverage\r\n- [ ] Code is well-documented\r\n\r\n### Changes ###\r\n- [ ] Feature1, tests, (and when applicable, API doc)\r\n- [ ] Feature2, tests, (and when applicable, API doc)\r\n\r\n## Comments ##\r\n- If this change is a backward incompatible change, why must this change be made.\r\n- Interesting edge cases to note here\r\n","created_at":"2018-10-31T04:41:46Z","updated_at":"2018-12-05T15:06:27Z","closed_at":null,"merged_at":null,"merge_commit_sha":"17fc7f5ab0350f9a095c8ef1441b938784dd46e0","assignee":null,"assignees":[],"requested_reviewers":[{"login":"szha","id":2626883,"node_id":"MDQ6VXNlcjI2MjY4ODM=","avatar_url":"https://avatars2.githubusercontent.com/u/2626883?v=4","gravatar_id":"","url":"https://api.github.com/users/szha","html_url":"https://github.com/szha","followers_url":"https://api.github.com/users/szha/followers","following_url":"https://api.github.com/users/szha/following{/other_user}","gists_url":"https://api.github.com/users/szha/gists{/gist_id}","starred_url":"https://api.github.com/users/szha/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/szha/subscriptions","organizations_url":"https://api.github.com/users/szha/orgs","repos_url":"https://api.github.com/users/szha/repos","events_url":"https://api.github.com/users/szha/events{/privacy}","received_events_url":"https://api.github.com/users/szha/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/dmlc/gluon-nlp/pulls/387/commits","review_comments_url":"https://api.github.com/repos/dmlc/gluon-nlp/pulls/387/comments","review_comment_url":"https://api.github.com/repos/dmlc/gluon-nlp/pulls/comments{/number}","comments_url":"https://api.github.com/repos/dmlc/gluon-nlp/issues/387/comments","statuses_url":"https://api.github.com/repos/dmlc/gluon-nlp/statuses/b5ed642fd2879a04a0d5347bcba13508193483e3","head":{"label":"eric-haibin-lin:parallel","ref":"parallel","sha":"b5ed642fd2879a04a0d5347bcba13508193483e3","user":{"login":"eric-haibin-lin","id":5545640,"node_id":"MDQ6VXNlcjU1NDU2NDA=","avatar_url":"https://avatars1.githubusercontent.com/u/5545640?v=4","gravatar_id":"","url":"https://api.github.com/users/eric-haibin-lin","html_url":"https://github.com/eric-haibin-lin","followers_url":"https://api.github.com/users/eric-haibin-lin/followers","following_url":"https://api.github.com/users/eric-haibin-lin/following{/other_user}","gists_url":"https://api.github.com/users/eric-haibin-lin/gists{/gist_id}","starred_url":"https://api.github.com/users/eric-haibin-lin/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/eric-haibin-lin/subscriptions","organizations_url":"https://api.github.com/users/eric-haibin-lin/orgs","repos_url":"https://api.github.com/users/eric-haibin-lin/repos","events_url":"https://api.github.com/users/eric-haibin-lin/events{/privacy}","received_events_url":"https://api.github.com/users/eric-haibin-lin/received_events","type":"User","site_admin":false},"repo":{"id":133543560,"node_id":"MDEwOlJlcG9zaXRvcnkxMzM1NDM1NjA=","name":"gluon-nlp","full_name":"eric-haibin-lin/gluon-nlp","private":false,"owner":{"login":"eric-haibin-lin","id":5545640,"node_id":"MDQ6VXNlcjU1NDU2NDA=","avatar_url":"https://avatars1.githubusercontent.com/u/5545640?v=4","gravatar_id":"","url":"https://api.github.com/users/eric-haibin-lin","html_url":"https://github.com/eric-haibin-lin","followers_url":"https://api.github.com/users/eric-haibin-lin/followers","following_url":"https://api.github.com/users/eric-haibin-lin/following{/other_user}","gists_url":"https://api.github.com/users/eric-haibin-lin/gists{/gist_id}","starred_url":"https://api.github.com/users/eric-haibin-lin/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/eric-haibin-lin/subscriptions","organizations_url":"https://api.github.com/users/eric-haibin-lin/orgs","repos_url":"https://api.github.com/users/eric-haibin-lin/repos","events_url":"https://api.github.com/users/eric-haibin-lin/events{/privacy}","received_events_url":"https://api.github.com/users/eric-haibin-lin/received_events","type":"User","site_admin":false},"html_url":"https://github.com/eric-haibin-lin/gluon-nlp","description":"NLP made easy","fork":true,"url":"https://api.github.com/repos/eric-haibin-lin/gluon-nlp","forks_url":"https://api.github.com/repos/eric-haibin-lin/gluon-nlp/forks","keys_url":"https://api.github.com/repos/eric-haibin-lin/gluon-nlp/keys{/key_id}","collaborators_url":"https://api.github.com/repos/eric-haibin-lin/gluon-nlp/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/eric-haibin-lin/gluon-nlp/teams","hooks_url":"https://api.github.com/repos/eric-haibin-lin/gluon-nlp/hooks","issue_events_url":"https://api.github.com/repos/eric-haibin-lin/gluon-nlp/issues/events{/number}","events_url":"https://api.github.com/repos/eric-haibin-lin/gluon-nlp/events","assignees_url":"https://api.github.com/repos/eric-haibin-lin/gluon-nlp/assignees{/user}","branches_url":"https://api.github.com/repos/eric-haibin-lin/gluon-nlp/branches{/branch}","tags_url":"https://api.github.com/repos/eric-haibin-lin/gluon-nlp/tags","blobs_url":"https://api.github.com/repos/eric-haibin-lin/gluon-nlp/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/eric-haibin-lin/gluon-nlp/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/eric-haibin-lin/gluon-nlp/git/refs{/sha}","trees_url":"https://api.github.com/repos/eric-haibin-lin/gluon-nlp/git/trees{/sha}","statuses_url":"https://api.github.com/repos/eric-haibin-lin/gluon-nlp/statuses/{sha}","languages_url":"https://api.github.com/repos/eric-haibin-lin/gluon-nlp/languages","stargazers_url":"https://api.github.com/repos/eric-haibin-lin/gluon-nlp/stargazers","contributors_url":"https://api.github.com/repos/eric-haibin-lin/gluon-nlp/contributors","subscribers_url":"https://api.github.com/repos/eric-haibin-lin/gluon-nlp/subscribers","subscription_url":"https://api.github.com/repos/eric-haibin-lin/gluon-nlp/subscription","commits_url":"https://api.github.com/repos/eric-haibin-lin/gluon-nlp/commits{/sha}","git_commits_url":"https://api.github.com/repos/eric-haibin-lin/gluon-nlp/git/commits{/sha}","comments_url":"https://api.github.com/repos/eric-haibin-lin/gluon-nlp/comments{/number}","issue_comment_url":"https://api.github.com/repos/eric-haibin-lin/gluon-nlp/issues/comments{/number}","contents_url":"https://api.github.com/repos/eric-haibin-lin/gluon-nlp/contents/{+path}","compare_url":"https://api.github.com/repos/eric-haibin-lin/gluon-nlp/compare/{base}...{head}","merges_url":"https://api.github.com/repos/eric-haibin-lin/gluon-nlp/merges","archive_url":"https://api.github.com/repos/eric-haibin-lin/gluon-nlp/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/eric-haibin-lin/gluon-nlp/downloads","issues_url":"https://api.github.com/repos/eric-haibin-lin/gluon-nlp/issues{/number}","pulls_url":"https://api.github.com/repos/eric-haibin-lin/gluon-nlp/pulls{/number}","milestones_url":"https://api.github.com/repos/eric-haibin-lin/gluon-nlp/milestones{/number}","notifications_url":"https://api.github.com/repos/eric-haibin-lin/gluon-nlp/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/eric-haibin-lin/gluon-nlp/labels{/name}","releases_url":"https://api.github.com/repos/eric-haibin-lin/gluon-nlp/releases{/id}","deployments_url":"https://api.github.com/repos/eric-haibin-lin/gluon-nlp/deployments","created_at":"2018-05-15T16:25:43Z","updated_at":"2018-12-03T19:44:48Z","pushed_at":"2018-12-04T07:19:34Z","git_url":"git://github.com/eric-haibin-lin/gluon-nlp.git","ssh_url":"git@github.com:eric-haibin-lin/gluon-nlp.git","clone_url":"https://github.com/eric-haibin-lin/gluon-nlp.git","svn_url":"https://github.com/eric-haibin-lin/gluon-nlp","homepage":"http://gluon-nlp.mxnet.io","size":3435,"stargazers_count":0,"watchers_count":0,"language":"Python","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":"master"}},"base":{"label":"dmlc:master","ref":"master","sha":"5d523ad65976f92b7ac72fbaba872241a57e9b47","user":{"login":"dmlc","id":11508361,"node_id":"MDEyOk9yZ2FuaXphdGlvbjExNTA4MzYx","avatar_url":"https://avatars2.githubusercontent.com/u/11508361?v=4","gravatar_id":"","url":"https://api.github.com/users/dmlc","html_url":"https://github.com/dmlc","followers_url":"https://api.github.com/users/dmlc/followers","following_url":"https://api.github.com/users/dmlc/following{/other_user}","gists_url":"https://api.github.com/users/dmlc/gists{/gist_id}","starred_url":"https://api.github.com/users/dmlc/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dmlc/subscriptions","organizations_url":"https://api.github.com/users/dmlc/orgs","repos_url":"https://api.github.com/users/dmlc/repos","events_url":"https://api.github.com/users/dmlc/events{/privacy}","received_events_url":"https://api.github.com/users/dmlc/received_events","type":"Organization","site_admin":false},"repo":{"id":128121076,"node_id":"MDEwOlJlcG9zaXRvcnkxMjgxMjEwNzY=","name":"gluon-nlp","full_name":"dmlc/gluon-nlp","private":false,"owner":{"login":"dmlc","id":11508361,"node_id":"MDEyOk9yZ2FuaXphdGlvbjExNTA4MzYx","avatar_url":"https://avatars2.githubusercontent.com/u/11508361?v=4","gravatar_id":"","url":"https://api.github.com/users/dmlc","html_url":"https://github.com/dmlc","followers_url":"https://api.github.com/users/dmlc/followers","following_url":"https://api.github.com/users/dmlc/following{/other_user}","gists_url":"https://api.github.com/users/dmlc/gists{/gist_id}","starred_url":"https://api.github.com/users/dmlc/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dmlc/subscriptions","organizations_url":"https://api.github.com/users/dmlc/orgs","repos_url":"https://api.github.com/users/dmlc/repos","events_url":"https://api.github.com/users/dmlc/events{/privacy}","received_events_url":"https://api.github.com/users/dmlc/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/dmlc/gluon-nlp","description":"NLP made easy","fork":false,"url":"https://api.github.com/repos/dmlc/gluon-nlp","forks_url":"https://api.github.com/repos/dmlc/gluon-nlp/forks","keys_url":"https://api.github.com/repos/dmlc/gluon-nlp/keys{/key_id}","collaborators_url":"https://api.github.com/repos/dmlc/gluon-nlp/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/dmlc/gluon-nlp/teams","hooks_url":"https://api.github.com/repos/dmlc/gluon-nlp/hooks","issue_events_url":"https://api.github.com/repos/dmlc/gluon-nlp/issues/events{/number}","events_url":"https://api.github.com/repos/dmlc/gluon-nlp/events","assignees_url":"https://api.github.com/repos/dmlc/gluon-nlp/assignees{/user}","branches_url":"https://api.github.com/repos/dmlc/gluon-nlp/branches{/branch}","tags_url":"https://api.github.com/repos/dmlc/gluon-nlp/tags","blobs_url":"https://api.github.com/repos/dmlc/gluon-nlp/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/dmlc/gluon-nlp/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/dmlc/gluon-nlp/git/refs{/sha}","trees_url":"https://api.github.com/repos/dmlc/gluon-nlp/git/trees{/sha}","statuses_url":"https://api.github.com/repos/dmlc/gluon-nlp/statuses/{sha}","languages_url":"https://api.github.com/repos/dmlc/gluon-nlp/languages","stargazers_url":"https://api.github.com/repos/dmlc/gluon-nlp/stargazers","contributors_url":"https://api.github.com/repos/dmlc/gluon-nlp/contributors","subscribers_url":"https://api.github.com/repos/dmlc/gluon-nlp/subscribers","subscription_url":"https://api.github.com/repos/dmlc/gluon-nlp/subscription","commits_url":"https://api.github.com/repos/dmlc/gluon-nlp/commits{/sha}","git_commits_url":"https://api.github.com/repos/dmlc/gluon-nlp/git/commits{/sha}","comments_url":"https://api.github.com/repos/dmlc/gluon-nlp/comments{/number}","issue_comment_url":"https://api.github.com/repos/dmlc/gluon-nlp/issues/comments{/number}","contents_url":"https://api.github.com/repos/dmlc/gluon-nlp/contents/{+path}","compare_url":"https://api.github.com/repos/dmlc/gluon-nlp/compare/{base}...{head}","merges_url":"https://api.github.com/repos/dmlc/gluon-nlp/merges","archive_url":"https://api.github.com/repos/dmlc/gluon-nlp/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/dmlc/gluon-nlp/downloads","issues_url":"https://api.github.com/repos/dmlc/gluon-nlp/issues{/number}","pulls_url":"https://api.github.com/repos/dmlc/gluon-nlp/pulls{/number}","milestones_url":"https://api.github.com/repos/dmlc/gluon-nlp/milestones{/number}","notifications_url":"https://api.github.com/repos/dmlc/gluon-nlp/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/dmlc/gluon-nlp/labels{/name}","releases_url":"https://api.github.com/repos/dmlc/gluon-nlp/releases{/id}","deployments_url":"https://api.github.com/repos/dmlc/gluon-nlp/deployments","created_at":"2018-04-04T20:57:13Z","updated_at":"2018-12-05T13:00:41Z","pushed_at":"2018-12-05T08:38:09Z","git_url":"git://github.com/dmlc/gluon-nlp.git","ssh_url":"git@github.com:dmlc/gluon-nlp.git","clone_url":"https://github.com/dmlc/gluon-nlp.git","svn_url":"https://github.com/dmlc/gluon-nlp","homepage":"http://gluon-nlp.mxnet.io","size":6185,"stargazers_count":1145,"watchers_count":1145,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":231,"mirror_url":null,"archived":false,"open_issues_count":60,"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":231,"open_issues":60,"watchers":1145,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/dmlc/gluon-nlp/pulls/387"},"html":{"href":"https://github.com/dmlc/gluon-nlp/pull/387"},"issue":{"href":"https://api.github.com/repos/dmlc/gluon-nlp/issues/387"},"comments":{"href":"https://api.github.com/repos/dmlc/gluon-nlp/issues/387/comments"},"review_comments":{"href":"https://api.github.com/repos/dmlc/gluon-nlp/pulls/387/comments"},"review_comment":{"href":"https://api.github.com/repos/dmlc/gluon-nlp/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/dmlc/gluon-nlp/pulls/387/commits"},"statuses":{"href":"https://api.github.com/repos/dmlc/gluon-nlp/statuses/b5ed642fd2879a04a0d5347bcba13508193483e3"}},"author_association":"COLLABORATOR"}}
{"actor":{"display_login":"leezu"}}