fc.py 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. ## @package fc
  2. # Module caffe2.python.helpers.fc
  3. from caffe2.python import core
  4. from caffe2.python.modeling import initializers
  5. from caffe2.python.modeling.parameter_info import ParameterTags
  6. def _FC_or_packed_FC(
  7. model, op_call, blob_in, blob_out, dim_in, dim_out, weight_init=None,
  8. bias_init=None, WeightInitializer=None, BiasInitializer=None,
  9. enable_tensor_core=False, float16_compute=False, **kwargs
  10. ):
  11. WeightInitializer = initializers.update_initializer(
  12. WeightInitializer, weight_init, ("XavierFill", {})
  13. )
  14. BiasInitializer = initializers.update_initializer(
  15. BiasInitializer, bias_init, ("ConstantFill", {})
  16. )
  17. if not model.init_params:
  18. WeightInitializer = initializers.ExternalInitializer()
  19. BiasInitializer = initializers.ExternalInitializer()
  20. blob_out = blob_out or model.net.NextName()
  21. bias_tags = [ParameterTags.BIAS]
  22. if 'freeze_bias' in kwargs:
  23. bias_tags.append(ParameterTags.COMPUTED_PARAM)
  24. weight = model.create_param(
  25. param_name=blob_out + '_w',
  26. shape=[dim_out, dim_in],
  27. initializer=WeightInitializer,
  28. tags=ParameterTags.WEIGHT
  29. )
  30. bias = model.create_param(
  31. param_name=blob_out + '_b',
  32. shape=[dim_out, ],
  33. initializer=BiasInitializer,
  34. tags=bias_tags
  35. )
  36. # enable TensorCore by setting appropriate engine
  37. if enable_tensor_core:
  38. kwargs['engine'] = 'TENSORCORE'
  39. # Enable float 16 compute kernel (relevant for CUDA)
  40. if float16_compute:
  41. kwargs['float16_compute'] = True
  42. return op_call([blob_in, weight, bias], blob_out, **kwargs)
  43. def fc(model, *args, **kwargs):
  44. return _FC_or_packed_FC(model, model.net.FC, *args, **kwargs)
  45. def packed_fc(model, *args, **kwargs):
  46. return _FC_or_packed_FC(model, model.net.PackedFC, *args, **kwargs)
  47. def fc_decomp(
  48. model, blob_in, blob_out, dim_in, dim_out,
  49. rank_approx=5, weight_init=None, bias_init=None,
  50. WeightInitializer=None, BiasInitializer=None, **kwargs
  51. ):
  52. """FC_Decomp version
  53. Here we assume that the rank of original input is bigger than 5.
  54. """
  55. WeightInitializer = initializers.update_initializer(
  56. WeightInitializer, weight_init, ("XavierFill", {})
  57. )
  58. BiasInitializer = initializers.update_initializer(
  59. BiasInitializer, bias_init, ("ConstantFill", {})
  60. )
  61. blob_out = blob_out or model.net.NextName()
  62. u = model.create_param(
  63. param_name=blob_out + '_u',
  64. shape=[dim_out, rank_approx],
  65. initializer=WeightInitializer,
  66. )
  67. v = model.create_param(
  68. param_name=blob_out + '_v',
  69. shape=[dim_in, rank_approx],
  70. initializer=WeightInitializer,
  71. )
  72. bias = model.create_param(
  73. param_name=blob_out + '_b',
  74. shape=[dim_out, ],
  75. initializer=BiasInitializer,
  76. )
  77. return model.net.FC_Decomp([blob_in, u, v, bias], blob_out, **kwargs)
  78. def fc_prune(
  79. model, blob_in, blob_out, dim_in, dim_out,
  80. weight_init=None, bias_init=None, mask_init=None,
  81. threshold=0.00001, need_compress_rate=False,
  82. comp_lb=0.05,
  83. **kwargs
  84. ):
  85. """FC_Prune version
  86. Runnable so far. Great!:)
  87. """
  88. weight_init = weight_init if weight_init else ('XavierFill', {})
  89. bias_init = bias_init if bias_init else ('ConstantFill', {})
  90. mask_init = mask_init if mask_init else ('ConstantFill', {})
  91. blob_out = blob_out or model.net.NextName()
  92. compress_rate = blob_out + '_compress_rate'
  93. if model.init_params:
  94. compress_lb = model.param_init_net.ConstantFill(
  95. [],
  96. blob_out + '_lb',
  97. shape=[1],
  98. value=comp_lb
  99. )
  100. weight = model.param_init_net.__getattr__(weight_init[0])(
  101. [],
  102. blob_out + '_w',
  103. shape=[dim_out, dim_in],
  104. **weight_init[1]
  105. )
  106. mask = model.param_init_net.ConstantFill(
  107. [],
  108. blob_out + '_m',
  109. shape=[dim_out, dim_in],
  110. value=1.0
  111. )
  112. ag_dw = model.param_init_net.__getattr__(mask_init[0])(
  113. [],
  114. blob_out + '_ag_dw',
  115. shape=[dim_out, dim_in],
  116. **mask_init[1]
  117. )
  118. bias = model.param_init_net.__getattr__(bias_init[0])(
  119. [],
  120. blob_out + '_b',
  121. shape=[dim_out, ],
  122. **bias_init[1]
  123. )
  124. mask_seq = model.param_init_net.__getattr__(mask_init[0])(
  125. [],
  126. blob_out + '_mask_seq',
  127. shape=[dim_out, dim_in],
  128. **mask_init[1]
  129. )
  130. thres = model.param_init_net.ConstantFill(
  131. [],
  132. blob_out + '_thres',
  133. shape=[1],
  134. value=threshold
  135. )
  136. else:
  137. compress_lb = core.ScopedBlobReference(
  138. blob_out + '_lb', model.param_init_net)
  139. weight = core.ScopedBlobReference(
  140. blob_out + '_w', model.param_init_net)
  141. bias = core.ScopedBlobReference(
  142. blob_out + '_b', model.param_init_net)
  143. mask = core.ScopedBlobReference(
  144. blob_out + '_m', model.param_init_net)
  145. ag_dw = core.ScopedBlobReference(
  146. blob_out + '_ag_dw', model.param_init_net)
  147. mask_seq = core.ScopedBlobReference(
  148. blob_out + '_mask_seq', model.param_init_net)
  149. thres = core.ScopedBlobReference(
  150. blob_out + '_thres', model.param_init_net)
  151. model.AddParameter(weight)
  152. model.AddParameter(bias)
  153. if need_compress_rate:
  154. return model.net.FC_Prune([blob_in, weight, mask, bias, ag_dw, mask_seq,
  155. thres, compress_lb],
  156. [blob_out, compress_rate], **kwargs)
  157. else:
  158. return model.net.FC_Prune([blob_in, weight, mask,
  159. bias, ag_dw, mask_seq,
  160. thres, compress_lb],
  161. blob_out, **kwargs)
  162. def fc_sparse(
  163. model, blob_in, blob_out, w_csr, iw, jw, bias,
  164. **kwargs
  165. ):
  166. """FC_Sparse: Only takes in allocated weights"""
  167. if not (w_csr and iw and jw and bias):
  168. print("Warning...")
  169. model.AddParameter(w_csr)
  170. model.AddParameter(iw)
  171. model.AddParameter(jw)
  172. model.AddParameter(bias)
  173. return model.net.FC_Sparse([blob_in, w_csr, iw, jw, bias],
  174. blob_out, **kwargs)