codefuse-ai/MFTCoder

MFTCoder微调codefuse34b模型后,发现模型代码补全这块的回复能力就没了,求解决方案

Closed this issue · 3 comments

这边通过MFTCoder给codefuse34b的模型进行qlora+4bit量化训练,以希望给模型增加一些内部工具的代码知识。但是训练后明显发现模型似乎是"失去了"代码补全的效果。最初怀疑是自己训练数据质量不佳造成,于是采用了官方开源的CodeExercise-Python-27k数据集去微调codefuse34b模型,微调后发现该情况仍然存在,求问有什么比较好的训练方式去避免该情况的出现?
附:
训练前的模型:(直接就会补全代码,不会有多余的解释)
bf4c5942d0590a3e9a72c3404124016
微调后的模型:(变成类似传统LLM聊天形式的回复)
de10d162a882dbc6a30f375625e63b1

方案1: 用SST格式做推理,即不带<|role_start|>human<|role_end|>和<|role_start|>bot<|role_end|>这些角色标签,例如Prompt设置成下面这样

from typing import List
 
def separate_paren_groups(paren_string: str) -> List[str]:
""" Input to this function is a string containing multiple groups of nested parentheses. Your goal is to
separate those group into separate strings and return the list of those.
Separate groups are balanced (each open brace is properly closed) and not nested within each other
Ignore any spaces in the input string.
>>> separate_paren_groups('( ) (( )) (( )( ))')
['()', '(())', '(()())']
"""

这样可以解决你微调后无法补全的问题,但以这种格式进行部署推理,则无法再支持对话式的问答

方案2: 自己构建一个代码补全数据集,格式示例如下:
Prompt:

<|role_start|>human<|role_end|># language: Python
from typing import List
 
def separate_paren_groups(paren_string: str) -> List[str]:
""" Input to this function is a string containing multiple groups of nested parentheses. Your goal is to
separate those group into separate strings and return the list of those.
Separate groups are balanced (each open brace is properly closed) and not nested within each other
Ignore any spaces in the input string.
>>> separate_paren_groups('( ) (( )) (( )( ))')
['()', '(())', '(()())']
"""
<|role_start|>bot<|role_end|>

Label:

    groups = []

    current_group = ""
    open_parens = 0
    for char in paren_string:
        if char == "(":
            open_parens += 1
        elif char == ")":
            open_parens -= 1
        if open_parens == 0:
            groups.append(current_group + char)
            current_group = ""
        else:
            current_group += char

    return groups

其他语言类似,其他语言格式可以参考HumanEval-X数据集
将这种方式构建的数据集当成MFTCoder的一个微调任务与其他任务一起微调,这样就可以跟你加训前一样既支持补全也支持问答了

这边通过MFTCoder给codefuse34b的模型进行qlora+4bit量化训练,以希望给模型增加一些内部工具的代码知识。但是训练后明显发现模型似乎是"失去了"代码补全的效果。最初怀疑是自己训练数据质量不佳造成,于是采用了官方开源的CodeExercise-Python-27k数据集去微调codefuse34b模型,微调后发现该情况仍然存在,求问有什么比较好的训练方式去避免该情况的出现? 附: 训练前的模型:(直接就会补全代码,不会有多余的解释) bf4c5942d0590a3e9a72c3404124016 微调后的模型:(变成类似传统LLM聊天形式的回复) de10d162a882dbc6a30f375625e63b1

请问你环境如何设置的?我按照ds框架的教程 无法进行微调