ziwang-com / zero-lora

zero零训练llm调参

Home Page:http://www.m-f.vip

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

从头开始的训练美洲驼

ziwang-com opened this issue · comments

ggerganov/ggml#8

通过从头开始的小训练美洲驼实现骆驼的向后传递示例
ggerganov/llama.cpp#1360

@ggerganov我现在已经成功测试了美洲驼所需的所有向后传递。https://github.com/xaedes/llama.cpp/tree/training-integrate

我必须添加的所有新操作的列表:

GGML_OP_ADD1:我想我可以用add(X,repeat(Y,X))代替它
GGML_OP_ADD_AT:查看向后传递所必需的。这会将 src1 添加到视图 (src0),但返回形状为 src0 的张量。也许这个操作可以得到另一个像ACC_VIEW一样的名字?
GGML_OP_SUM_ROWS:重复向后传递所必需的:通过对行求和来减少行。形状[A,B,C,D] ->形状[1,b,c,d]
GGML_OP_SILU_BACK : 西鲁向后传球所必需的
GGML_OP_RMS_NORM_BACK:也可以使用原语实现,但会牺牲性能。
GGML_OP_GET_ROWS_BACK:get_rows向后传递所必需的:将 src0[i] 行添加到 opt0[src1[i]] 行,返回形状为 opt0 的张量。也许此操作可以得到一个更有意义的名称,例如ADD_ROWS_TO或ACC_ROWS_TO?
GGML_OP_DIAG :softmax向后传递是必需的,替代方案是直接实现SOFTMAX_BACK,但DIAG至少可用于其他东西。它将行转换为对角矩阵。
GGML_OP_DIAG_MASK_ZERO : diag_mask_inf向后传递所必需的
GGML_OP_ROPE_BACK : 绳索向后通过所必需的。
值得注意的其他变化:

为比例、diag_mask_inf、soft_max和绳索添加就地和非就地变体
修复 sub、mul 和 div 函数以与转置张量正常工作,使用与 add 中相同的逻辑:
修复ggml_forward_add函数以正确处理转置张量。使用与 ggml_compute_forward_add_q_f32 中相同的逻辑,但使其在所有ggml_compute_forward_add_中保持一致...功能。这也略微改变了不同线程的 MEM 访问模式,使其像ggml_compute_forward_add_q_f32一样工作。也许 for 循环中的 mem 模式 for (int j = ith; j < n; j += nth) 很重要?现在,每个线程都有要处理的连续行范围:for (int ir = ir0; ir < ir1; ++ir)
删除重复ggml_forward_dup代码处理相同类型的连续张量。有了这个,我们可以复制任何类型的张量,只要它们是连续的。该函数用于 dup、get_rows_back 和 diag_mask(如果不是就位时)。
有一些可能过于冗长的注释,包括可以清除的梯度的逐步推导。
接下来,我将研究在某个后期层上训练小美洲驼或小型 LoRa 微调的示例.可能是我在此过程中发现了一些仍未发现的问题^^

训练的各个部分的性能可以提高,特别是快速ggml_out_prod可以帮助加快矩阵乘法向后传递的速度。

还有两个额外的测试文件,一个用于测试从 ggml 存储库获取的梯度,另一个用于测试一般优化的小测试。

小型美洲驼模型的示例性训练在自给自足的婴儿美洲驼示例中得到证明,在该示例中,它被训练为输出正弦波。

image