在当今的人工智能领域,机器人多模态大模型的应用日益广泛。本文旨在介绍如何将多模态大模型转换为 gguf 格式并进行量化,以便在 ollama 平台上实现高效部署。通过这一过程,实现更高效的模型运行和更低的资源消耗。
多模态大模型的转换和量化是为了优化模型的性能和资源使用。主流的转换方式包括将模型从 safetensor 格式转换为 .bin 或 gguf 格式。我们选择 gguf 格式是因为它在 ollama 平台上具有更好的兼容性和性能表现。
1.模型格式转换
在实现过程中,我们使用了高性能的服务器硬件,例如 RTX4090*2显卡,以确保在转换和量化过程中有足够的计算能力和内存支持。此外,ollama 平台的支持也为模型的高效运行提供了保障。
2.硬件部署环境:青龙人形机器人
具身智能的概念可以追溯到1950年,图灵在论文《Computing Machinery and Intelligence》中提出机器像人一样能和环境交互感知,自主规划、决策、行动,并具备执行能力,是AI的终极形态。大语言模型和传统机器学习的区别,就在于泛化能力强,在复杂任务理解、连续对话、零样本推理等方向有了突破进展。这让机器人的理解力、连续决策力、人机交互能力有了全新的解决思路。大模型时代,大模型作为机器人的“大脑”,多模态作为机器人的“小脑”,模型的训练和测试与云服务相结合,可以在云上虚拟仿真场景下,进行端到端的实时训练与测试,快速完成端侧迭代与开发,这就大大加速了具身智能体的进化速度。
目前,诸多大厂已在具身智能领域进行布局,如工业制造、仓储物流、监控侦测、环境探索、应急救援、集群作战等。谷歌发布 PaLM-E;微软将 ChatGPT 扩展到机器人领域;阿里巴巴-千问大模型接入工业机器人等。
波士顿动力(Boston Dynamics)
:足式机器人Spot、物流机器人Stretch和人形机器人Atlas等都是具身大模型机器人。波士顿动力正在做机器人功能性和表达性相结合的研究,包含四个研究领域(认知AI、运动AI、先进硬件设计和伦理道德)。最新研究方向包括:(1)观察-理解-实践项目,运动能力和认知能力相结合。Eg.机器人观察人类的生产线行为,模仿人类跳舞,实践,无需手动编程;场景识别(工作)、导航、理解人类任务、使用工具;感知汽车、零部件、人类行为等。消费级应用:教机器人做自己常做的菜。(2)检查-诊断-修复项目(医疗,核辐射修复,石油钻井平台)。Eg.检查设备工作是否正常、智能诊断、修复;修理家用电器。(3)灵巧的移动操作能力项目。(4)伦理道德项目,机器人的法律与政策、技术与设计、社会规范、市场力量。
ABB:
(1)立体仓库;(2)机器人视觉应用:①机器人引导:物品挑拣、箱式挑拣、码垛拆垛、装配指导、拾捡和放置;②质量检验:装配检测、几何分析、缺陷检测;③导航和地图绘制:人机安全、AGV导航、防撞;编程;(3)RAPID编程(ABB所属,系统代码和应用代码模块),Wizard(可视化编程),引导式编程(机器人示教),自主路径规划;(4)工业机器人:物料搬运、高精度装配、点焊、激光焊、涂胶、机加工。
青龙全尺寸通用人形机器人
是这一领域的杰出代表。它具备高度仿生的躯干构型和拟人化的运动控制,具备快速行走、敏捷避障、稳健上下坡、抗冲击干扰等运动功能。其全身拥有多达 43 个自由度,最大关节峰值扭矩达 396N.m,这使得它在灵活性和力量方面都接近人类。
青龙机器人仿人灵巧手分左手和右手,采用模块化设计,本采用模块式可拆卸结构,实现与人形机械臂的快拆快换。每个手指/拇指指尖、手掌部分集成阵列式触觉传感器,可实现精确的接触感知。整体外观设计参考人手及实际抓取需求,与人手近似,简约美观。具备高抓重比与抓取自适应的特点,响应速度快、运动灵活、外形高度仿人手;采用快换机构,方便与机械臂的拆装;具备触觉感知能力,手指采用模块化原则设计。
|
|
|
本体有19个自由度,6个主动自由度,拇指有3个自由度(2个主动自由度),可实现主动弯曲伸展与主动侧向摆动,四个手指均有4个自由度(1个主动自由度),可实现主动弯曲伸展与被动侧向摆动
|
|
|
|
|
|
|
|
|
|
|
|
|
1.准备工作:
首先,克隆 ollama 和 llama.cpp 的代码库,并初始化子模块。
2.安装依赖:
在虚拟环境中安装必要的 Python 包。
3.构建量化工具:
使用 make 命令构建量化工具。
4.转换模型格式:
将 safetensor 格式的多模态大模型转换为 gguf 格式。
5.量化模型:
使用 llama-quantize 工具对模型进行量化。
6.微调模型并导入 ollama:
创建 Modelfile 文件,并在本地运行和上传 ollama 模型。
1.单纯的语言模型转换方式
参考:https://blog.csdn.net/spiderwower/article/details/138506271
2.下载ollama和llama.cpp
git clone https:
git clone https:
git clone https:
3.模型转化格式并量化
将llama.cpp文件夹放入ollama/llm中(替换掉原来空的llama.cpp文件夹)
cd /llama.cpp
pip install -r requirements.txt
python convert.py D:\huggingface\robollava-merged --outtype f16 --outfile D:\huggingface\robollava-convert/con
由于llama.cpp不支持多模态大模型,故采用下面的方式:(autodl服务器/linux里)
参考:
https://blog.csdn.net/weixin_53162188/article/details/137754362
https://ollama.fan/getting-started/import/#setup
① 准备工作:
git clone https:
cd ollama
git submodule init
git submodule update llm/llama.cpp
python3 -m venv llm/llama.cpp/.venv
source llm/llama.cpp/.venv/bin/activate
pip install -r llm/llama.cpp/requirements.txt
make -C llm/llama.cpp quantize
④ 转换模型格式:(在服务器RTX4090中,不然内存可能不足,需要q4_0精读的gguf格式的大模型文件)
a. safetensor格式的多模态大模型文件转换为.bin格式文件(仅做记录用)
使用工具:https://github.com/davidtorcivia/convert-safetensor-to-bin/tree/main
按链接配置好环境后,修改safetensor-to-bin.py文件为:
safetensor-to-bin.py
代
码如下:
import torch
import os
from safetensors import safe_open
import argparse
from safetensors.torch import load_file, save_file
def convert_safetensors_to_bin(input_path, output_path):
if os.path.isdir(input_path):
# 如果输入是目录,则所有的 .safetensors 文件都需要被处理
tensors = {}
for file in os.listdir(input_path):
if file.endswith('.safetensors'):
file_path = os.path.join(input_path, file)
tensors.update(load_file(file_path))
else:
# 如果输入是单个.safetensors文件
tensors = load_file(input_path)
# 保存为 .bin 格式
torch.save(tensors, output_path)
print(f"Model converted successfully and saved to {output_path}")
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="Convert .safetensors model to .bin format")
parser.add_argument('input_path', type=str, help='Path to the input .safetensors file')
parser.add_argument('output_path', type=str, help='Path to save the output .bin file')
args = parser.parse_args()
convert_safetensors_to_bin(args.input_path, args.output_path)
#终端里运行即可
python safetensor-to-bin.py /root/autodl-tmp/robollava-merged /root/autodl-tmp/robollava-bin.bin
b. safetensor格式的多模态大模型文件转换为gguf格式文件
pip install torch safetensors transformers gguf llama-cpp-python
#在之前创建的/autodl-tmp/LLAVA文件夹中创建st2gguf.py,代码如下:
import os
import sys
import torch
from gguf import GGUFWriter, MODEL_ARCH_NAMES
# 添加 LLaVA 目录到 Python 路径
sys.path.append('/root/autodl-tmp/LLaVA')
from llava.model.language_model.llava_llama import LlavaLlamaForCausalLM as LlavaForConditionalGeneration
# 设置路径
model_dir = '/root/autodl-tmp/robollava-merged'
output_path = '/root/autodl-tmp/robollava.gguf'
# 加载模型
model = LlavaForConditionalGeneration.from_pretrained(model_dir, torch_dtype=torch.float16)
# 转换为 GGUF 格式
def convert_llava_to_gguf(model, output_path):
config = model.config
gguf_writer = GGUFWriter(output_path, "llama")
# 添加模型参数到 GGUF
for name, param in model.state_dict().items():
gguf_writer.add_tensor(name, param.detach().cpu().numpy())
# 添加架构信息和其他元数据
metadata = {
"llama.architecture": "llama",
"llama.vocab_size": config.vocab_size,
"llama.dim": config.hidden_size,
"llama.multiple_of": 256,
"llama.n_heads": config.num_attention_heads,
"llama.n_layers": config.num_hidden_layers,
"llama.n_kv_heads": getattr(config, 'num_key_value_heads', config.num_attention_heads),
"llama.norm_eps": config.rms_norm_eps,
"llama.max_seq_len": config.max_position_embeddings,
"llama.context_length": config.max_position_embeddings,
"llama.tensor_data_type"