2
我有cntk中的模型,它由一个嵌入层和一个跟随的LSTM组成。我想将嵌入查找操作放在CPU上,并将其余的网络放在GPU上。
在tensorflow,我会做如何在CNTK中为特定操作设置设备?
with tf.device("/cpu:0"):
什么是cntk等效,我可以包装成这样的:
C.layers.Embedding(embedding_size)
我有cntk中的模型,它由一个嵌入层和一个跟随的LSTM组成。我想将嵌入查找操作放在CPU上,并将其余的网络放在GPU上。
在tensorflow,我会做如何在CNTK中为特定操作设置设备?
with tf.device("/cpu:0"):
什么是cntk等效,我可以包装成这样的:
C.layers.Embedding(embedding_size)
在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