【问题标题】:How to set device for specific operation in CNTK?如何在 CNTK 中为特定操作设置设备?
【发布时间】:2017-07-24 22:41:51
【问题描述】:

我在cntk 中有一个模型,它由一个嵌入层和一个后续的LSTM 组成。我想将嵌入查找操作放在 CPU 上,而将网络的其余部分放在 GPU 上。
在张量流中,我会这样做

with tf.device("/cpu:0"):

我可以将它包装成 cntk 中的等价物是什么:

C.layers.Embedding(embedding_size)

【问题讨论】:

    标签: python cntk


    【解决方案1】:

    在 CNTK 中,设备控制是针对特定功能/网络的前向/后向传递,而不是单个操作。如果您想在 CPU 中执行特定操作而在 GPU 中执行其余操作,则必须执行以下操作:

    features = C.input_variable(input_dim)
    labels = C.input_variable(label_dim)
    embedding_input = C.input_variable(embedding_size, needs_gradient=True)
    embedding = C.layers.Embedding(embedding_size)(features)
    loss = rest_of_your_network(embedding_input, labels)
    emb_state, embedding_value = embedding.forward({features: some_data}, keep_for_backward=set(embedding.output), device=C.cpu(), as_numpy=False)
    loss_state, loss_value = loss.forward({embedding_input: embedding_value}, keep_for_backward=set(loss.output), device=C.gpu(0), as_numpy=False)
    loss_grad_dict = loss.backward(loss_state, {loss.output: np.ones_like(loss_value)}, set(loss.parameters + [embedding_input]))
    emb_grad_dict = embedding.backward(emb_state, {embedding.output: loss_grad_dict[embedding_input]}, set(embedding.parameters))
    # use these dictionaries to update the parameters with a learner
    

    【讨论】:

      猜你喜欢
      • 2012-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多