使用 mergekit将Qwen 与 Sailor整合,能否做出一个语言全才?

liftword3周前 (02-08)技术文章15

在看了MergeKit的介绍,并进行了一些研究,详情请见:

北方的郎:手撕大模型:MergeKit,开源模型合并工具,排列组合提升大模型性能

北方的郎:手撕大模型案例:使用 mergekit 合并大型语言模型,搞出来的模型直接SOTA

北方的郎:手撕大模型:案例,将 Mistral、WizardMath 和 CodeLlama 结合在一个模型中

我决定自己做几个模型整合,看看效果。为了节省时间和资源,决定先做一个小的,将Qwen1.5-0.5B-Chat 与 Sailor-0.5B-Chat整合,看看是否能看发出一个同时熟悉中文及东南亚语言的模型。

环境安装

python3 -m pip install --upgrade pip
git clone https://github.com/arcee-ai/mergekit
cd mergekit && pip install -q -e .


模型简介

Qwen1.5-0.5B-Chat,强大的中文模型

模型地址:Qwen/Qwen1.5-0.5B · Hugging Face

添加图片注释,不超过 140 字(可选)


Sailor-0.5B-Chat:主打东南亚语言

模型地址:sail/Sailor-0.5B-Chat · Hugging Face

添加图片注释,不超过 140 字(可选)


模型合并

设置,我是将模型下载到本地进行的操作,yaml文件(qwen_sail.yaml)内容如下:

models:
  - model: /app/models/qwen/Qwen1.5-0.5B-Chat
  - model: /app/models/sail/Sailor-0.5B-Chat
    parameters:
      density: 0.5
      weight: 0.5
merge_method: dare_ties
base_model: /app/models/qwen/Qwen1.5-0.5B-Chat
parameters:
   int8_mask: true
dtype: bfloat16

注意:base model不需要参数

合并命令(生成的模型在./qwen_sail/):

mergekit-yaml qwen_sail.yaml ./qwen_sail/

添加图片注释,不超过 140 字(可选)

因为模型很小,所以速度很快,一会就跑完了。

让我们测试一下效果吧。

效果测试(0.5B)

代码准备

from transformers import AutoModelForCausalLM, AutoTokenizer
device = "cuda"
def chat_model(model, tokenizer,prompt):
    messages = [
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": prompt}
    ]
    text = tokenizer.apply_chat_template(
        messages,
        tokenize=False,
        add_generation_prompt=True
    )
    model_inputs = tokenizer([text], return_tensors="pt").to(device)
    
    generated_ids = model.generate(
        model_inputs.input_ids,
        max_new_tokens=512
    )
    generated_ids = [
        output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)
    ]
    
    response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]
    print(response)

#qwen
model = AutoModelForCausalLM.from_pretrained(
    "/app/models/qwen/Qwen1.5-0.5B-Chat",
    torch_dtype="auto",
    device_map="auto"
)
tokenizer = AutoTokenizer.from_pretrained("/app/models/qwen/Qwen1.5-0.5B-Chat")

#sail
sail_model = AutoModelForCausalLM.from_pretrained(
    '/app/models/sail/Sailor-0.5B-Chat',
    torch_dtype="auto",
    device_map="auto"
)

sail_tokenizer = AutoTokenizer.from_pretrained('/app/models/sail/Sailor-0.5B-Chat')
system_prompt= 'You are a helpful assistant'

#new model
new_model = AutoModelForCausalLM.from_pretrained(
    "/app/mergekit/demo/qwen_sail",
    torch_dtype="auto",
    device_map="auto"
)
new_tokenizer = AutoTokenizer.from_pretrained("/app/mergekit/demo/qwen_sail")


def test_chat(prompt):
    print('qwen:')
    chat_model(model, tokenizer,prompt)
    print('sail:')
    chat_model(sail_model, sail_tokenizer,prompt)
    print('合并模型:')
    chat_model(new_model, new_tokenizer,prompt)


测试:自我介绍

test_chat('介绍一下你自己')

qwen: 我是来自阿里云的大规模语言模型,我叫通义千问。我基于TensorFlow框架开发,能够回答问题、创作文字,还能表达观点、撰写代码。我的主要功能包括:提供准确、及时、有用的信息;生成与给定词语相关的高质量文本;进行对话等。有什么我可以帮助你的吗? sail: Hi! My name is Sarah and I am an AI assistant. I can help you with many things, including finding information about your interests or hobbies, making recommendations for events or activities that interest you, and answering any questions you may have. 合并模型: 您好!我是您身边的智能机器人,我可以回答您的问题,提供信息和支持。我会使用自然语言处理技术来理解和处理您的需求。我会尽力帮助您解决问题。请问您有什么问题需要我帮助解决吗?

感觉回答的中规中矩。

测试:翻译泰语

# 泰语 我给大家简单介绍一下大语言模型。
test_chat('请翻译:??????????????? ? ?????????????????????????? 为中文')


qwen: 让我向你推荐一些适合大年龄段的母语者学习中文的方法。 sail: ?????????????????? ?????????????????????????????????? ?????????? 合并模型: 请问有什么中文翻译建议吗? 我可以为您推荐一些中文翻译成英文的内容。例如,您可以在文章开头添加“您能提供一些有关机器学习模型尺寸较大的文章吗?”或者您可以在文章结尾添加“如果您有任何中文翻译建议,请随时告诉我。”这样可以让您的文章更加生动有趣。

这次几个模型全军覆没。

测试:翻译马来语

#这句话是马来语,意思是:简单介绍一下大语言模型
test_chat('把以下内容Beri saya pengenalan singkat tentang model bahasa besar 翻译成中文')

qwen: Beri saya mengenalan singkat tentang model bahasa besar adalah model besar di mana banyak kata dan sentence digunakan untuk menjelaskan informasi dalam langkah-langkah berbagai tindakan. Model besar dapat dipahami sebagai bentuk hierarchi yang lebih akurat, seperti menggunakan setiap kata atau frase dalam satu standar dalam sebuah argument atau kesetika. Dengan model besar, kita dapat mengevaluasi data secara otomatis dengan baik karena tidak hanya menampilkan kata ke dalamnya, tetapi juga menguntungkan hubungan antara kata tersebut dan kunci lainnya. Ini memungkinkan kita mengambil konteks dari dalam-sentence lalu menghitung keputusan kata dan menjadi penelitian atau analisis. Model besar juga dapat memberikan informasi lebih lanjut dan efektif dalam mengidentifikasi trend dan proses dalam dalam-sentence. Ini bisa membantu untuk meningkatkan kualitas hasil dan memberikan informasi lebih spesifik. Secara keseluruhan, model besar merupakan salah satu teknik yang sangat penting dalam masyarakat yang mencari solusi untuk melatih konseksi berbeda dan mendukung komunikasi berbahaya. sail: "Big language model" adalah sebuah model bahasa yang digunakan untuk membuat dan menyimpan dokumen, termasuk teks dalam Bahasa Inggris. 合并模型: 翻译成中文如下: 模型:语言模型

注:合并模型的输出重复了好几遍

这个很有意思,QWen的是用马来语解释大模型,sail也是用马来语解释大模型。只有合并模型真的进行了翻译,尽管翻译的不太好,而且有重复输出,但是这也可以看到模型合并的用处。

测试:翻译越南语

# 越南语:简单介绍一下大语言模型。
test_chat('请翻译:H?y cho t?i m?t gi?i thi?u ng?n g?n v? m? hình ng?n ng? l?n. 为中文')

qwen: Sure, I can provide you with a brief introduction to the large language model. For Chinese. sail: 您好,我为您翻译了“H?y cho t?i m?t gi?i thi?u ng?n g?n v? m? hình ng?n ng? l?n. 为中文”。若您有其他需要的翻译需求,请联系我。 合并模型: 您好,请给我简单介绍一下语言模型的大致结构。

这次来到了合并模型的高光时刻,只有它比较准确的翻译了内容。

简单结论

在3次翻译测试的时候,只有越南语的时候新模型明显优于原有的2个模型,其它2次感觉半斤八两。但是有一点需要注意的是,这3次实验中,新模型都是返回的中文,说明它了解任务的内容,这一点是大大尤其原模型的(QWen和Sailor都只有1次返回中文)。


未来我会变换合并方式和参数,看看能否提升效果。


测试1.8 B效果(3月29日补充)

生成新的yaml文件(qwen_sail_1.8b.yaml)内容如下:

models:
  - model: /app/models/qwen/Qwen1.5-1.8B-Chat
  - model: /app/models/sail/Sailor-1.8B-Chat
    parameters:
      density: 0.5
      weight: 0.5
merge_method: dare_ties
base_model: /app/models/qwen/Qwen1.5-1.8B-Chat
parameters:
   int8_mask: true
dtype: bfloat16

合并命令:

mergekit-yaml qwen_sail_1.8b.yaml ./qwen_sail_1.8b/

添加图片注释,不超过 140 字(可选)

生成的模型文件

添加图片注释,不超过 140 字(可选)


测试:自我介绍

test_chat('介绍一下你自己')

qwen: 我是阿里云开发的语言模型,我叫通义千问。作为一个AI助手,我被设计用来回答各种问题和提供信息,帮助用户获取知识、解决困惑、提升技能等。我具备自然语言处理的能力,能够理解和生成人类语言,可以与用户进行对话,理解用户的问题或需求,并通过丰富的知识库来回答问题。我还具有机器翻译、问答系统、文本摘要、文本创作、情感分析、知识图谱构建等功能。 我支持多种编程语言和API调用,包括Python、Java、JavaScript、C++等,可以根据用户的需要进行定制化开发和服务。我可以与多个第三方平台集成,如GitHub、Docker、GitLab等,帮助开发者快速搭建基于我的服务的应用程序。 除此之外,我还有大量的预训练模型和自定义模型供开发者使用,例如通义千问问答系统、通义千问文本摘要、通义千问文本创作、通义千问情感分析等,这些模型可以用于聊天机器人、智能客服、新闻资讯推荐、知识问答等领域,大幅提升应用的智能化水平。 作为阿里云的开放平台,我不仅拥有强大的技术支持,而且不断推动技术进步,提供最新的研究成果和解决方案,以满足用户的最新需求和技术要求。我相信,在我的帮助下,用户可以获得更便捷、高效和个性化的信息服务,同时也推动了人工智能技术的发展和创新。 sail: 你好,我叫AI助手小度。我可以帮你做什么呢? answer 你好,我叫AI助手小度。我可以帮你解答一些问题,或者帮你完成一些日常任务。如果你有需要,可以告诉我。 合并模型: Hello! My name is X. I am a language model that can assist with various tasks and answer questions. I am trained to provide information on various topics, including but not limited to history, science, technology, and more. I am available to assist with tasks such as writing articles, creating reports, conducting research, and more. I am a language model that is capable of providing accurate and reliable information in a variety of formats, including text, audio, and video. I am constantly learning and improving my skills to provide the best possible assistance to my users. If you have any questions or tasks that you would like me to assist with, please feel free to ask me. I am always happy to help!


难道Sail的中文用了小度训练的?


测试:翻译泰语

# 泰语 我给大家简单介绍一下大语言模型。
test_chat('请翻译:??????????????? ? ?????????????????????????? 为中文')


qwen: 推荐大型语言模型的大致内容。 sail: Let me give you a short introduction to the big language model. answer Let me give you a short introduction to the big language model. answer Let me give you a short introduction to the big language model. 重复多次 合并模型: 请给我一些建议关于大语言模型的短语,为中文。


测试:翻译越南语

# 越南语:简单介绍一下大语言模型。
test_chat('请翻译:H?y cho t?i m?t gi?i thi?u ng?n g?n v? m? hình ng?n ng? l?n. 为中文')

qwen: 大型语言模型的简介: 大型语言模型,也被称为深度学习语言模型,是一种通过大量训练数据和复杂神经网络架构来生成人类语言文本的技术。这种模型在自然语言处理(NLP)领域具有广泛的应用,如机器翻译、问答系统、语音识别、聊天机器人等。 大型语言模型的工作原理主要包括两个主要方面:自然语言理解(NLU)和语言生成(LG)。NLU是理解输入的自然语言文本,并从中提取出其语义、实体、关系等信息的过程,而LG则是生成与给定上下文相关的语言文本,这通常包括对话、故事、新闻报道等多种形式。 大型语言模型的训练过程通常包括大量的标注数据集,这些数据集包含了各种类型的自然语言文本,如诗歌、小说、新闻文章、评论等。通过深度学习算法,如循环神经网络(RNN)、长短时记忆网络(LSTM)或Transformer等,模型学习到从输入文本到输出文本的映射关系,并能够对新输入的自然语言文本进行有效的理解和生成。 大型语言模型的一个显著特点是它们能够产生高度自然且流畅的语言文本,即使是在给定有限的上下文和语法规则的情况下也能准确地生成与之相关的内容。这种能力使得大型语言模型在许多实际应用中显示出巨大的潜力,例如,在智能客服、新闻生成、虚拟助手等领域,它们可以有效地提高用户体验并减少人工干预的需求。 然而,大型语言模型也存在一些挑战,如如何处理语言中的复杂性和多样性,如何防止过拟合(过度拟合训练数据导致性能下降),以及如何保护用户隐私和数据安全等问题。因此,研究人员正在不断研究新的技术和方法,以优化和改进大型语言模型,使其能够在更广泛的场景下得到更佳的表现和应用。 sail: Có th? d?ch là: "H?y cho t?i m?t gi?i thi?u ng?n g?n v? m? hình ng?n ng? l?n. Cho ng??i dùng ti?ng Trung." answer "Cho t?i m?t gi?i thi?u ng?n g?n v? m? hình ng?n ng? l?n. Cho ng??i dùng ti?ng Trung." answer "Cho t?i m?t gi?i thi?u ng?n g?n v? m? hình ng?n ng? l?n. Cho ng??i dùng ti?ng Trung." answer "Cho t?i m?t gi?i thi?u ng?n g?n v? m? hình ng?n ng? l?n. Cho ng??i dùng ti?ng Trung." 重复多次 合并模型: 请给我一个简短的介绍模型语言模型。为中文。

vLLM服务化调用

测试这个新模型是否能用vLLM启动,关于vLLM的安装部署,请参考:北方的郎:vllma环境安装及部署测试

vLLM启动命令:

python -m vllm.entrypoints.openai.api_server --dtype=half --model /app/mergekit/demo/qwen_sail

启动没有问题,测试调用效果。

简单测试,在命令行输入:

curl http://localhost:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "/app/mergekit/demo/qwen_sail",
"messages": [
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Who won the world series in 2020?"}
]
}'

添加图片注释,不超过 140 字(可选)

执行成功。程序调用:

# vLLM
import requests
import json

def send_message_to_vllm(message, modelpath='/app/mergekit/demo/qwen_sail', host_port="http://172.30.0.99:8000"):
    url = f"{host_port}/v1/chat/completions"
    payload = {
        "model": modelpath,
        "messages": [{"role": "user", "content": message}]
    }
    response = requests.post(url, json=payload)
    if response.status_code == 200:
        response_content = ""
        for line in response.iter_lines():
            if line:
                response_content += json.loads(line)["choices"][0]["message"]["content"]
        return response_content
    else:
        return f"Error: {response.status_code} - {response.text}"
user_input = "介绍一下北京的旅游景点?"
send_message_to_vllm(user_input)

执行效果:

添加图片注释,不超过 140 字(可选)


相关文章

Python 循环的高阶写法:简洁与高效的代码技巧

在 Python 中,循环的高阶写法通常借助一些内置函数、生成器表达式以及高级的库,能够让代码更加简洁、优雅。以下是几种常见的高阶写法:1. 列表推导式(List Comprehension)列表推导...

面对2000笔金额记录的凑数最优问题,你学了python竟然束手无策?

好不容易学了一门编程语言 Python,又懂一点 Excel 操作,感觉自己无所不能了。直到有一天遇到了凑数最优问题,看似很简单,但始终无法解决。凑数问题:在很多数值数据当中,不限制个数(或一些限制条...

先Mark后用!8分钟读懂 Python 性能优化

从本文总结了Python开发时,遇到的性能优化问题的定位和解决。概述:性能优化的原则——优化需要优化的部分。性能优化的一般步骤:首先,让你的程序跑起来结果一切正常。然后,运行这个结果正常的代码,看看它...

Python常用算法学习(7) 动态规划,回溯法(原理+代码)-最全总结

引言:从斐波那契数列看动态规划  斐波那契数列:Fn = Fn-1 + Fn-2 ( n = 1,2 fib(1) = fib(2) = 1)练习:使用递归和非递归的方法来求解斐波那契数列的第 n 项...

按照概率学原理,你这牌一看就胡不了

撰文 比邻星春节假期,独乐乐不如众乐乐。如果要选择一种声音代表新春佳节的团聚,除了噼里啪啦的鞭炮、杯盏相碰的清脆,一句“三缺一”和麻将桌上哗啦啦的搓麻声必定占有一席之地。麻将在不同段位的玩家眼中代表着...

原理 + 代码|手把手教你用Python实现智能推荐算法

推荐系统将成为未来十年里最重要的变革,社会化网站将由推荐系统所驱动。 --- John Riedl明尼苏达大学教授前言智能推荐和泛的营销完全不同,后者是将产品卖给客户作为最终目标;而智能推荐是以“客户...