You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mxnet.apache.org by GitBox <gi...@apache.org> on 2018/03/20 03:19:51 UTC

[GitHub] sxjscience opened a new issue #10167: HybridBlock can be slower than Block

sxjscience opened a new issue #10167: HybridBlock can be slower than Block
URL: https://github.com/apache/incubator-mxnet/issues/10167
 
 
   Here's an interesting example that HybridBlock can sometimes be much slower than Block. We define an Identity block using two strategies and compare the running time.
   
   ```python
   import mxnet as mx
   import time
   from mxnet.gluon import Block, HybridBlock
   
   
   class HybridIdentity(HybridBlock):
       def hybrid_forward(self, F, x):
           return x
   
   class NoHybridIdentity(Block):
       def forward(self, x):
           return x
   
   
   class LoopIdentityBlock(Block):
       def __init__(self, use_hybrid=False, prefix=None, params=None):
           super(LoopIdentityBlock, self).__init__(prefix=prefix, params=params)
           if use_hybrid:
               self.identity = HybridIdentity()
           else:
               self.identity = NoHybridIdentity()
   
       def forward(self, x):
           for i in range(100000):
               x = self.identity(x)
           return x
   
   
   for _ in range(5):
       _ = mx.nd.ones((100, 100)).sum().asscalar()
   
   hybrid_loop_block = LoopIdentityBlock(use_hybrid=True)
   loop_block = LoopIdentityBlock(use_hybrid=False)
   x = mx.nd.ones((1024, 1024, 512))
   start = time.time()
   for _ in range(5):
       loop_block(x)
       mx.nd.waitall()
   end = time.time()
   print('Identity W/o Hybrid:', end - start)
   
   start = time.time()
   for _ in range(5):
       hybrid_loop_block(x)
       mx.nd.waitall()
   end = time.time()
   print('Identity With Hybrid:', end - start)
   
   
   hybrid_loop_block.hybridize()
   start = time.time()
   for _ in range(5):
       hybrid_loop_block(x)
       mx.nd.waitall()
   end = time.time()
   print('Identity With Hybrid + hybridize:', end - start)
   ```
   
   The result is:
   ```log
   Identity W/o Hybrid: 0.3092458248138428
   Identity With Hybrid: 3.6667261123657227
   Identity With Hybrid + hybridize: 16.659943342208862
   ```
   We can find that in this case, using Block is a better choice than using HybridBlock.

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
users@infra.apache.org


With regards,
Apache Git Services