char-fork/llama.cpp
git clone https://git.t4t.associates/char-fork/llama.cpp
37a215c9e
char/aliceai-t5-moe
1#include "opt-step.hpp" 2 3#define SYCL_OPT_STEP_BLOCK_SIZE 256 4 5template < typename T > 6static void opt_step_adamw_f32_kernel ( 7T * __restrict__x , 8const T * __restrict__g , 9T * __restrict__g_m , 10T * __restrict__g_v , 11const T * __restrict__pars , 12const int64_t k , 13const sycl::nd_item < 1 > & item ) { 14 15const int64_t i = (int64_t )item .get_global_id (0 ); 16if (i >=k ) { 17return ; 18 } 19 20const float alpha = pars [0 ]; 21const float beta1 = pars [1 ]; 22const float beta2 = pars [2 ]; 23const float eps = pars [3 ]; 24const float wd = pars [4 ]; 25const float beta1h = pars [5 ]; 26const float beta2h = pars [6 ]; 27 28const float gi = g [i ]; 29const float gmi = g_m [i ]* beta1 + gi * (1.0f - beta1 ); 30const float gvi = g_v [i ]* beta2 + gi * gi * (1.0f - beta2 ); 31 32g_m [i ]= gmi ; 33g_v [i ]= gvi ; 34 35const float mh = gmi * beta1h ; 36const float vh = sycl::sqrt (gvi * beta2h )+ eps ; 37 38x [i ]= x [i ]* (1.0f - alpha * wd )- alpha * mh /vh ; 39} 40 41template < typename T > 42static void opt_step_sgd_f32_kernel ( 43T * __restrict__x , 44const T * __restrict__g , 45const T * __restrict__pars , 46const int64_t k , 47const sycl::nd_item < 1 > & item ) { 48 49const int64_t i = (int64_t )item .get_global_id (0 ); 50if (i >=k ) { 51return ; 52 } 53 54x [i ]= x [i ]* (1.0f - pars [0 ]* pars [1 ])- pars [0 ]* g [i ]; 55} 56 57void ggml_sycl_opt_step_adamw (ggml_backend_sycl_context & ctx ,ggml_tensor * dst ) { 58scope_op_debug_print scope_dbg_print (__func__ ,dst ,/*num_src=*/ 5 ); 59 60const ggml_tensor * src0 = dst -> src [0 ]; 61const ggml_tensor * src0_grad = dst -> src [1 ]; 62const ggml_tensor * src0_grad_m = dst -> src [2 ]; 63const ggml_tensor * src0_grad_v = dst -> src [3 ]; 64const ggml_tensor * adamw_params = dst -> src [4 ]; 65 66GGML_ASSERT (src0 -> type == GGML_TYPE_F32 ); 67GGML_ASSERT (src0_grad -> type == GGML_TYPE_F32 ); 68GGML_ASSERT (src0_grad_m -> type == GGML_TYPE_F32 ); 69GGML_ASSERT (src0_grad_v -> type == GGML_TYPE_F32 ); 70GGML_ASSERT (adamw_params -> type == GGML_TYPE_F32 ); 71GGML_ASSERT (ggml_is_contiguous (src0 )); 72GGML_ASSERT (ggml_is_contiguous (src0_grad )); 73GGML_ASSERT (ggml_is_contiguous (src0_grad_m )); 74GGML_ASSERT (ggml_is_contiguous (src0_grad_v )); 75GGML_ASSERT (ggml_is_contiguous (adamw_params )); 76GGML_ASSERT (ggml_are_same_shape (src0 ,src0_grad )); 77GGML_ASSERT (ggml_are_same_shape (src0 ,src0_grad_m )); 78GGML_ASSERT (ggml_are_same_shape (src0 ,src0_grad_v )); 79GGML_ASSERT (ggml_nelements (adamw_params )== 7 ); 80 81 dpct::queue_ptr stream = ctx .stream (); 82SYCL_CHECK (ggml_sycl_set_device (ctx .device )); 83 84float * src0_d = (float * )src0 -> data ; 85const float * src0_grad_d = (const float * )src0_grad -> data ; 86float * src0_grad_m_d = (float * )src0_grad_m -> data ; 87float * src0_grad_v_d = (float * )src0_grad_v -> data ; 88const float * adamw_params_d = (const float * )adamw_params -> data ; 89 90const int64_t ne = ggml_nelements (src0 ); 91const int64_t num_blocks = (ne + SYCL_OPT_STEP_BLOCK_SIZE - 1 ) /SYCL_OPT_STEP_BLOCK_SIZE ; 92 93stream -> parallel_for ( 94 sycl::nd_range < 1 > (num_blocks * SYCL_OPT_STEP_BLOCK_SIZE ,SYCL_OPT_STEP_BLOCK_SIZE ), 95 [= ](sycl::nd_item < 1 > item ) { 96opt_step_adamw_f32_kernel (src0_d ,src0_grad_d ,src0_grad_m_d ,src0_grad_v_d ,adamw_params_d ,ne ,item ); 97 }); 98} 99 100void ggml_sycl_opt_step_sgd (ggml_backend_sycl_context & ctx ,ggml_tensor * dst ) { 101scope_op_debug_print scope_dbg_print (__func__ ,dst ,/*num_src=*/ 3 ); 102 103const ggml_tensor * src0 = dst -> src [0 ]; 104const ggml_tensor * src0_grad = dst -> src [1 ]; 105const ggml_tensor * sgd_params = dst -> src [2 ]; 106 107GGML_ASSERT (src0 -> type == GGML_TYPE_F32 ); 108GGML_ASSERT (src0_grad -> type == GGML_TYPE_F32 ); 109GGML_ASSERT (sgd_params -> type == GGML_TYPE_F32 ); 110GGML_ASSERT (ggml_is_contiguous (src0 )); 111GGML_ASSERT (ggml_is_contiguous (src0_grad )); 112GGML_ASSERT (ggml_is_contiguous (sgd_params )); 113GGML_ASSERT (ggml_are_same_shape (src0 ,src0_grad )); 114GGML_ASSERT (ggml_nelements (sgd_params )== 2 ); 115 116 dpct::queue_ptr stream = ctx .stream (); 117SYCL_CHECK (ggml_sycl_set_device (ctx .device )); 118 119float * src0_d = (float * )src0 -> data ; 120const float * src0_grad_d = (const float * )src0_grad -> data ; 121const float * sgd_params_d = (const float * )sgd_params -> data ; 122 123const int64_t ne = ggml_nelements (src0 ); 124const int64_t num_blocks = (ne + SYCL_OPT_STEP_BLOCK_SIZE - 1 ) /SYCL_OPT_STEP_BLOCK_SIZE ; 125 126stream -> parallel_for ( 127 sycl::nd_range < 1 > (num_blocks * SYCL_OPT_STEP_BLOCK_SIZE ,SYCL_OPT_STEP_BLOCK_SIZE ), 128 [= ](sycl::nd_item < 1 > item ) { 129opt_step_sgd_f32_kernel (src0_d ,src0_grad_d ,sgd_params_d ,ne ,item ); 130 }); 131}