多图理解,更懂中文,支持function call的Phi-3.5来了!

01.引言

微软继今年4月推出Phi-3系列小型语言模型后,又一鼓作气三连发布并开源其「小而美」系列 Phi-3.5模型!

本次发布的三个模型各有特色:

Mini型:Phi-3.5-mini-instruct(3.8B)

Phi-3.5 mini 具有 38 亿个参数,基于Phi-3 的数据集(合成数据和经过筛选的公开网站)构建,重点关注高质量、推理密集的数据。该模型属于 Phi-3 模型系列,支持 128K 令牌上下文长度。该模型经过了严格的增强过程,结合了监督微调、近端策略优化和直接偏好优化,以确保精确遵守指令和强大的安全措施。Phi-3.5 mini 在中文场景有所增强,但是受限于模型的大小,依然会有较多的事实错误,通过RAG的方式可以有效降低错误。

MoE型:Phi-3.5-MoE-instruct (16x3.8B)

Phi-3.5-MoE-instruct是一个MoE模型,有 16x3.8B 个参数,使用 2 位专家时有 6.6B 个活动参数。该模型使用词汇量为 32,064 的标记器。Phi-3.5-MoE-instruct在推理能力上大大增强(尤其是数学和逻辑),也非常适用于function call的场景。

多模态:Phi-3.5-vision-instruct (4.2B)

Phi-3.5-vision-instruct 多模态版本可支持 128K 上下文长度(以 token 为单位)有 4.2B 参数,主要包含图像编码器和 Phi-3 Mini 语言模型。本次Phi-3.5-vision-instruct 支持多图理解,在如下场景上有较好的效果:

  • 一般图像理解;

  • 光学字符识别 (OCR)

  • 图表和表格理解;

  • 多幅图像比较;

  • 多图像或视频片段摘要

同时魔搭社区已经上线Phi-3.5-mini-instruct-GGUF,可更加方便的使用ollama,llama.cpp,lmstudio等工具运行。

模型链接:

Phi-3.5-mini-instruct:

https://modelscope.cn/models/LLM-Research/Phi-3.5-mini-instruct

Phi-3.5-MoE-instruct:

https://modelscope.cn/models/LLM-Research/Phi-3.5-MoE-instruct

Phi-3.5-vision-instruct :

https://modelscope.cn/models/LLM-Research/Phi-3.5-vision-instruct

Phi-3.5-mini-instruct-GGUF:

https://modelscope.cn/models/LLM-Research/Phi-3.5-mini-instruct-GGUF

cookbook链接:

https://github.com/microsoft/Phi-3CookBook

02.模型推理

Phi-3.5-mini-instruct

小模型Phi-3.5-mini-instruct在中文能力上有更好的支持。

import torch``from modelscope import AutoModelForCausalLM, AutoTokenizer``from transformers import pipeline``   ``torch.random.manual_seed(0)``   ``model = AutoModelForCausalLM.from_pretrained(`    `"LLM-Research/Phi-3.5-mini-instruct",``     device_map="cuda",  ``     torch_dtype="auto",  ``trust_remote_code=True,` `)``tokenizer = AutoTokenizer.from_pretrained("LLM-Research/Phi-3.5-mini-instruct")``   ``messages = "<|system|>\n 你是我的人工智能助手,协助我用中文解答问题.\n<|end|><|user|>\n 你知道长沙吗?? \n<|end|><|assistant|>"``   ``pipe = pipeline(`    `"text-generation",`    `model=model,`    `tokenizer=tokenizer,``)``   ``generation_args = {`    `"max_new_tokens": 500,`    `"return_full_text": False,`    `"temperature": 0.0,`    `"do_sample": False,``}``   ``output = pipe(messages, **generation_args)``print(output[0]['generated_text'])

Phi-3.5-vision-instruct

多模态模型Phi-3.5-vision-instruct支持了多图理解

from PIL import Image` `import requests` `from transformers import AutoModelForCausalLM` `from transformers import AutoProcessor` `from modelscope import snapshot_download``   ``model_id = snapshot_download("LLM-Research/Phi-3.5-vision-instruct")``   ``# Note: set _attn_implementation='eager' if you don't have flash_attn installed``model = AutoModelForCausalLM.from_pretrained(`  `model_id,``   device_map="cuda",  ``   trust_remote_code=True,  ``   torch_dtype="auto",  ``_attn_implementation='flash_attention_2'`    `)``   ``# for best performance, use num_crops=4 for multi-frame, num_crops=16 for single-frame.``processor = AutoProcessor.from_pretrained(model_id, ``   trust_remote_code=True,  ``  num_crops=4``)` `   ``images = []``placeholder = ""``   ``# Note: if OOM, you might consider reduce number of frames in this example.``for i in range(1,20):`    `url = f"https://modelscope.oss-cn-beijing.aliyuncs.com/resource/Introduction-to-Microsoft-Azure-Cloud-{i}-2048.webp"``    images.append(Image.open(requests.get(url, stream=True).raw))`    `placeholder += f"<|image_{i}|>\n"``   ``messages = [`    `{"role": "user", "content": placeholder+"Summarize the deck of slides."},``]``   ``prompt = processor.tokenizer.apply_chat_template(`  `messages,``   tokenize=False,  ``  add_generation_prompt=True``)``   ``inputs = processor(prompt, images, return_tensors="pt").to("cuda:0")` `   ``generation_args = { ``     "max_new_tokens": 1000,  ``     "temperature": 0.0,  ``"do_sample": False,` `}` `   ``generate_ids = model.generate(**inputs, ``   eos_token_id=processor.tokenizer.eos_token_id,  ``  **generation_args``)``   ``# remove input tokens` `generate_ids = generate_ids[:, inputs['input_ids'].shape[1]:]``response = processor.batch_decode(generate_ids, ``   skip_special_tokens=True,  ``clean_up_tokenization_spaces=False)[0]` `   ``print(response)

Phi-3.5-MoE-instruct

Phi-3.5-MoE-instruct模型推理能力更强,本文演示的为agent场景

`import torch``from transformers import AutoModelForCausalLM, AutoTokenizer, pipeline` `from modelscope import snapshot_download``model_dir = snapshot_download("LLM-Research/Phi-3.5-MoE-instruct")``torch.random.manual_seed(0)` `   ``model = AutoModelForCausalLM.from_pretrained( ``     model_dir,   ``     device_map="cuda",   ``     torch_dtype="auto",   ``trust_remote_code=True,`  `)` `   ``tokenizer = AutoTokenizer.from_pretrained(model_dir)` `   ``   ``pipe = pipeline( ``     "text-generation",  ``     model=model,  ``tokenizer=tokenizer,` `)` `   ``generation_args = { ``     "max_new_tokens": 500,  ``     "return_full_text": False,  ``     "temperature": 0.0,  ``"do_sample": False,` `}` 

设置system message

sys_msg = """You are a helpful AI assistant, you are an agent capable of using a variety of tools to answer a question. Here are a few of the tools available to you:``   ``- Blog: This tool helps you describe a certain knowledge point and content, and finally write it into Twitter or Facebook style content``- Translate: This is a tool that helps you translate into any language, using plain language as required``   ```To use these tools you must always respond in JSON format containing `"tool_name"` and `"input"` key-value pairs. For example, to answer the question, "Build Muliti Agents with MOE models" you must use the calculator tool like so:````````json ``   ``{`    `"tool_name": "Blog",`    `"input": "Build Muliti Agents with MOE models"``}``   `` ```````Or to translate the question "can you introduce yourself in Chinese" you must respond:``   `` ```json ``   ``{`    `"tool_name": "Search",`    `"input": "can you introduce yourself in Chinese"``}``   `` ````````Remember just output the final result, ouput in JSON format containing `"agentid"`,`"tool_name"` , `"input"` and `"output"`  key-value pairs .:````````json ``   ``[``   ``   ``{   "agentid": "step1",`    `"tool_name": "Blog",`    `"input": "Build Muliti Agents with MOE models",`    `"output": "........."``},``   ``{   "agentid": "step2",`    `"tool_name": "Search",`    `"input": "can you introduce yourself in Chinese",`    `"output": "........."``},``{`    `"agentid": "final"`    `"tool_name": "Result,`    `"output": "........."``}``]``   `` ```````The users answer is as follows.``"""
def instruction_format(sys_message: str, query: str):`    `# note, don't "</s>" to the end`    `return f'<|system|> {sys_message} <|end|>\n<|user|> {query} <|end|>\n<|assistant|>'
query ='Write something about Generative AI with MOE , translate it to Chinese'``input_prompt = instruction_format(sys_msg, query)``   ``import os``   ``os.environ["PYTORCH_CUDA_ALLOC_CONF"] = "expandable_segments:True "``output = pipe(input_prompt, **generation_args)``output[0]['generated_text']

显存占用:


Phi-3.5-mini-instruct-GGUF

使用Ollama本地运行Phi-3.5-mini-instruct-GGUF

Linux环境使用

下载GGUF模型:

modelscope download --model=LLM-Research/Phi-3.5-mini-instruct-GGUF --local_dir . Phi-3.5-mini-instruct-Q5_K_M.gguf

Liunx用户可使用魔搭镜像环境安装【推荐】

modelscope download --model=modelscope/ollama-linux --local_dir ./ollama-linux``cd ollama-linux``sudo chmod 777 ./ollama-modelscope-install.sh``./ollama-modelscope-install.sh

启动Ollama服务

ollama serve

创建ModelFile

复制模型路径,创建名为“ModelFile”的meta文件,内容如下:

FROM /mnt/workspace/Phi-3.5-mini-instruct-Q5_K_M.gguf``TEMPLATE """``{{ if .System }}<|system|>``   ``{{ .System }}<|end|>``   ``{{ end }}{{ if .Prompt }}<|user|>``   ``{{ .Prompt }}<|end|>``   ``{{ end }}<|assistant|>``   ``{{ .Response }}<|end|>"""

创建自定义模型

使用ollama create命令创建自定义模型

ollama create myphi3_5 --file ./Modelfile

运行模型

ollama run myphi3_5

显存占用:

03.模型微调

我们使用ms-swift对LLM: Phi-3.5-mini-instruct, VLM: Phi-3.5-vision-instruct进行微调。swift是魔搭社区官方提供的大模型与多模态大模型微调推理框架。

ms-swift开源地址:https://github.com/modelscope/ms-swift

环境准备
git clone https://github.com/modelscope/swift.git``cd swift``pip install -e .[llm]``   ``# 可选, 对phi3_5-mini-instruct进行推理加速.``pip install vllm
LLM微调

这里我们使用alpaca-zh, alpaca-en作为示例数据集,展示可运行的demo。

您可以在modelscope上这两个数据集:

  • alpaca-zh:

    https://modelscope.cn/datasets/AI-ModelScope/alpaca-gpt4-data-zh

  • alpaca-en:

    https://modelscope.cn/datasets/AI-ModelScope/alpaca-gpt4-data-en

自定义数据集参考:https://swift.readthedocs.io/zh-cn/latest/LLM/%E8%87%AA%E5%AE%9A%E4%B9%89%E4%B8%8E%E6%8B%93%E5%B1%95.html

微调脚本:

# 显存占用: 4 * 11GB``# 以下脚本分别采样alpaca-zh, alpaca-en数据集20000条``# 更多超参数含义可以查看文档``CUDA_VISIBLE_DEVICES=0,1,2,3 NPROC_PER_NODE=4 swift sft \`  `--model_type phi3_5-mini-instruct \`  `--model_id_or_path LLM-Research/Phi-3.5-mini-instruct \`  `--sft_type lora \`  `--learning_rate 1e-4 \`  `--output_dir output \`  `--dataset alpaca-zh#20000 alpaca-en#20000 \`  `--lora_target_modules ALL \`  `--deepspeed default-zero2

微调后推理脚本:

# 推理``CUDA_VISIBLE_DEVICES=0 swift infer \`    `--ckpt_dir output/phi3_5-mini-instruct/vx-xxx/checkpoint-xxx \`    `--load_dataset_config true``   ``   ``# merge-lora 并使用vllm进行加速``CUDA_VISIBLE_DEVICES=0 swift infer \`    `--ckpt_dir output/phi3_5-mini-instruct/vx-xxx/checkpoint-xxx \`    `--load_dataset_config true --merge_lora true \`    `--infer_backend vllm

VLM微调

这里我们使用coco-en-mini作为示例数据集,该数据集的任务是对图片内容进行描述,展示可运行的demo。

您可以在 modelscope上找到该数据集:https://modelscope.cn/datasets/modelscope/coco_2014_caption/summary

自定义数据集格式如下(单图、多图和无图):

{"query": "<image>55555", "response": "66666", "images": ["image_path"]}``{"query": "eeeee<image>eeeee<image>eeeee", "response": "fffff", "history": [], "images": ["image_path1", "image_path2"]}``{"query": "EEEEE", "response": "FFFFF", "history": [["query1", "response2"], ["query2", "response2"]], "images": []}

微调脚本:

# 显存占用: 4 * 12GB``# 默认会将lora_target_modules设置为llm和projector所有的linear``CUDA_VISIBLE_DEVICES=0,1,2,3 NPROC_PER_NODE=4 swift sft \`  `--model_type phi3_5-vision-instruct \`  `--model_id_or_path LLM-Research/Phi-3.5-vision-instruct \`  `--sft_type lora \`  `--dataset coco-en-mini#20000 \`  `--deepspeed default-zero2

如果要使用自定义数据集,只需按以下方式进行指定:

  `--dataset train.jsonl \`  `--val_dataset val.jsonl \`

显存占用:

训练loss图(时间原因,只训练了450个step):

微调后推理脚本如下:

# 推理``CUDA_VISIBLE_DEVICES=0 swift infer \`    `--ckpt_dir output/phi3_5-vision-instruct/vx-xxx/checkpoint-xxx \`    `--load_dataset_config true``   ``# merge-lora并推理``CUDA_VISIBLE_DEVICES=0 swift infer \`    `--ckpt_dir output/phi3_5-vision-instruct/vx-xxx/checkpoint-xxx \`    `--load_dataset_config true --merge_lora true \`    `--safe_serialization false

微调后模型对验证集进行推理的示例:

如何学习大模型 AI ?

由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。

但是具体到个人,只能说是:

“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。

这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

在这里插入图片描述

第一阶段(10天):初阶应用

该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。

  • 大模型 AI 能干什么?
  • 大模型是怎样获得「智能」的?
  • 用好 AI 的核心心法
  • 大模型应用业务架构
  • 大模型应用技术架构
  • 代码示例:向 GPT-3.5 灌入新知识
  • 提示工程的意义和核心思想
  • Prompt 典型构成
  • 指令调优方法论
  • 思维链和思维树
  • Prompt 攻击和防范

第二阶段(30天):高阶应用

该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。

  • 为什么要做 RAG
  • 搭建一个简单的 ChatPDF
  • 检索的基础概念
  • 什么是向量表示(Embeddings)
  • 向量数据库与向量检索
  • 基于向量检索的 RAG
  • 搭建 RAG 系统的扩展知识
  • 混合检索与 RAG-Fusion 简介
  • 向量模型本地部署

第三阶段(30天):模型训练

恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。

到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?

  • 为什么要做 RAG
  • 什么是模型
  • 什么是模型训练
  • 求解器 & 损失函数简介
  • 小实验2:手写一个简单的神经网络并训练它
  • 什么是训练/预训练/微调/轻量化微调
  • Transformer结构简介
  • 轻量化微调
  • 实验数据集的构建

第四阶段(20天):商业闭环

对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。

  • 硬件选型
  • 带你了解全球大模型
  • 使用国产大模型服务
  • 搭建 OpenAI 代理
  • 热身:基于阿里云 PAI 部署 Stable Diffusion
  • 在本地计算机运行大模型
  • 大模型的私有化部署
  • 基于 vLLM 部署大模型
  • 案例:如何优雅地在阿里云私有部署开源大模型
  • 部署一套开源 LLM 项目
  • 内容安全
  • 互联网信息服务算法备案

学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。

如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

在这里插入图片描述

### Phi-3.5-mini-instruct性能对比 当评估Phi-3.5-mini-instruct与其他类似模型或不同版本之间的效果差异时,几个关键指标可以用来衡量这些模型的表现。主要关注点通常包括推理速度、参数量大小以及特定任务上的准确性。 #### 推理效率 对于较小规模的应用场景而言,Phi-3.5-mini-instruct由于其紧凑的设计,在保持一定精度的同时能够提供快的响应时间[^1]。这使得它特别适合于资源受限环境下的部署需求。 #### 参数数量 相较于大尺寸的语言模型变体,Phi-3.5-mini-instruct拥有少的参数数目。这种设计减少了计算开销并降低了硬件要求,从而提高了实际应用中的灵活性和可移植性。 #### 任务表现 尽管体积小巧,但在许自然语言处理任务上,如文本分类、问答系统等方面,该模型依然能展现出令人满意的性能水平。不过具体到某些复杂度较高的应用场景,则可能需要考虑采用具有参数的基础架构来获得好的结果。 为了直观展示上述几点区别,下面给出一段Python代码用于加载并测试两个不同版本(假设存在另一个较大版本称为`Phi-large`)之间在相同数据集上的预测速度: ```python from transformers import AutoModelForCausalLM, AutoTokenizer import time tokenizer_mini = AutoTokenizer.from_pretrained("LLM-Research/Phi-3.5-mini-instruct") model_mini = AutoModelForCausalLM.from_pretrained("LLM-Research/Phi-3.5-mini-instruct") # 假设有一个较大的版本 "Phi-large" tokenizer_large = AutoTokenizer.from_pretrained("path_to_Phi-large") model_large = AutoModelForCausalLM.from_pretrained("path_to_Phi-large") input_text = ["输入一些待测文本"] inputs_mini = tokenizer_mini(input_text, return_tensors="pt") inputs_large = tokenizer_large(input_text, return_tensors="pt") def measure_inference_time(model, inputs): start_time = time.time() _ = model.generate(**inputs) end_time = time.time() - start_time return end_time mini_model_time = measure_inference_time(model_mini, inputs_mini) large_model_time = measure_inference_time(model_large, inputs_large) print(f"Mini Model Inference Time: {mini_model_time:.4f} seconds") print(f"Large Model Inference Time: {large_model_time:.4f} seconds") ``` 通过运行这段脚本可以获得两种配置下完成同一组样本推断所需的时间差異,进而帮助理解它们各自的优势所在。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值