命令式和符号式混合编程 讨论区

http://zh.diveintodeeplearning.org/chapter_computational-performance/hybridize.html

请问前馈函数中F是一定要的吗?我在写一个多输入多输出的网络的时候,他报错说期望参数输入为ndarray却只拿到了symbol 见https://discuss.gluon.ai/t/topic/1778/3?u=xiaogehh

一定要F,已解决.

HybridBlock上是必须的

请问:

  1. net.hybridize()是不是只能针对输入大小固定不变的场景?(比如image-to-image的情况,运行输入大小能够改变,此时能够转为symbol吗?)

  2. 个人看到RNN是继承自Block而不是HybridBlock,这就是说明这类型的不能转为symbol对吧?(这个问题可能有些蠢,可能时间序列方面的层本身就不适合静态的—这方面不太了解)

谢谢~ :grinning:

也可以,只是可能会用频繁的内存重新分配,导致性能稍微差一点

RNN里面已经fuse了,你可以认为一部分图做了hybridize了。至于把可以hybridize的RNN做了的收益,目前还没有定论。所以先只是继承了Block,为了理解上方便

注意到Hybridize章节最下面的Sequential打成了Sequental, 不知道我理解的对不对 :smile:

谢谢,update了

wow 好迅速~:grin:

Mxnet的命令式接口是否也和pytorch一样使用了动态图计算? Hybrid的网络还symbol API用静态图优化做的计算

给位大神,运行时出现这个问题咋解决?OSError: /lib64/libc.so.6: version `GLIBC_2.16’ not found (required by /home/webmaster/miniconda3/envs/gluon/lib/python3.6/site-packages/mxnet/libmxnet.so) glibc版本也升到2.16了还是不行!

大量使用Gluon动态图接口的话,Hybirdize很痛苦
不知道有没有计划在symbol API里提供类似于tf.cond()的函数,方便使用?

Github上的issue的建议也只是使用where()去尽量实现:

暂时没有。但就做partial hybridize就行了吧。坏处是依赖python,但性能上应该差不多

嗯嗯,谢谢回复
主要是看Amazon那边有一个mxnet-model-server,但需要symbol.json才能运行,不能直接调用gluon定义的网络

哦,最近那么会有新的更快的server出来,要么mxnet-model-server会支持gluon

我在该部分文档中看到一句话:因为Python的代码只执行一次,而且是符号式的执行,那么使用print来调试,或者使用if和for来做复杂的控制都不可能了。
那如果我的代码中有if和for语句的话,那该怎么替换他们以便使用hybridze,for语句倒是可以暴力穷举来实现,那if语句怎么办。。。用while?。。。
emmm,去看了一下相关的课程视频,好像其实也是可以用for和if语句,但是for和if语句里面必须是固定的数值,而不能是变动的变化的。。不知道我理解的对不对

请问。。我写了一个由LSTMCell组成的网络,如果不net.hybridize(),那么不报错。但是hybridize了之后报错。。不知道为什么。。部分代码如下

class MyLSTM(nn.HybridBlock):
    def __init__(self, hidden_dim, **kwargs):
        super(MyLSTM, self).__init__(**kwargs)
        self.hidden_dim = hidden_dim
        with self.name_scope():
            self.drop = nn.Dropout(0.5)
            self.encoder = rnn.LSTMCell(hidden_size=self.hidden_dim, prefix='encoder')
            self.decoder = rnn.LSTMCell(hidden_size=self.hidden_dim, prefix='decoder')
            self.output_layer = nn.Dense(3*16)

简单的逻辑是,Encoder编码,然后传state给Decoder再解码
报错是
mxnet.base.MXNetError: Error in operator mylstm0_encoder_plus0: [19:56:44] d:\program files (x86)\jenkins\workspace\mxnet-tag\mxnet\src\operator\tensor…/elemwise_op_common.h:123: Check failed: assign(&dattr, (*vec)[i]) Incompatible attr in node mylstm0_encoder_plus0 at 1-th input: expected [5,200], got [64,200]

rnn的cell api需要在forward时候手动unroll,并且因为unroll长度时计算图不一样,不能用HybridBlock

1赞

那应该继承自什么才能够hybridize呢?
我看到LSTMCell继承自HybridRecurrentCell,这个应该是支持hybridize的

目前RNN都不支持完整图的hybridize,HybridRecurrentCell的作用是重用这一个RNN cell里的计算图,cell的展开依然是可变的