in src/optimize_op.cc [368:429]
void Compute(OpKernelContext* ctx) override
{
if (SMs_ == 0)
SMs_ = GetCountSMs();
ctx->forward_ref_input_to_ref_output(1, 0);
ctx->forward_ref_input_to_ref_output(2, 1);
ctx->forward_ref_input_to_ref_output(3, 2);
const Tensor& grad = ctx->input(0);
const Tensor& lr = ctx->input(4);
const Tensor& scal = ctx->input(5);
const Tensor& clip = ctx->input(6);
OpInputList norm_scale, gate;
ctx->input_list("norm_scale", &norm_scale);
ctx->input_list("gate", &gate);
const float* norm_scale_ptr = norm_scale.size() > 0 ? norm_scale[0].flat<float>().data() : NULL;
Tensor param = ctx->mutable_input(1, false);
Tensor mean = ctx->mutable_input(2, false);
Tensor var = ctx->mutable_input(3, false);
uint size, K;
if (lazy_emb_)
{
OP_REQUIRES(ctx, param.dims() == 2, errors::InvalidArgument("lazy_emb only applies to 2d embedding params"));
size = param.dim_size(0);
K = param.dim_size(1);
}
else
{
size = param.shape().num_elements();
K = 0;
}
CUstream stream = ((CUDAStream*)ctx->op_device_context()->stream()->implementation())->cuda_stream();
if (gate.size() > 0)
{
uint blocks = param.dim_size(0);
uint bsize = param.dim_size(1);
ApplyAdamGated<VG,VRM,VRV>(stream,
gate[0].flat<float>().data(),
(const VG*)grad.flat<TG>().data(),
norm_scale_ptr,
param.flat<float>().data(),
(VRM*)mean.flat<TR>().data(),
(VRV*)var.flat<TR>().data(),
lr.scalar<float>()(), decay_mean_, decay_var_, epsilon_, scal.scalar<float>()(), clip.scalar<float>()(), blocks, bsize, saturate_, zero_infs_, zero_nans_
);
}
ApplyAdam<VG,VRM,VRV>(stream, SMs_,
(const VG*)grad.flat<TG>().data(),
norm_scale_ptr,
param.flat<float>().data(),
(VRM*)mean.flat<TR>().data(),
(VRV*)var.flat<TR>().data(),
lr.scalar<float>()(), decay_mean_, decay_var_, epsilon_, scal.scalar<float>()(), clip.scalar<float>()(), size, K, saturate_, zero_infs_, zero_nans_
);
}