VILA运行全程踩坑笔记

VILA运行全程踩坑笔记

仓库地址:https://github.com/NVlabs/VILA

全文按照一路踩坑的时间顺序记录,不建议按照步骤一步一步来重复每一个踩坑的悲伤故事,不如先全部看完,再实际上手操作。
省流:官方这文档写得一点鸟用都没有,甚至不如github里面老哥们写的issue实用。

既然是奔着实际使用来的,那么直奔server部署方案,因为最后肯定是在别的项目里面调用API的,而官方也给出了看起来十分完美 的openAI式最终调用方式:

from openai import OpenAIclient = OpenAI(base_url="http://localhost:8000",api_key="fake-key",
)
response = client.chat.completions.create(messages=[{"role": "user","content": [{"type": "text", "text": "What’s in this image?"},{"type": "image_url","image_url": {"url": "https://blog.logomyway.com/wp-content/uploads/2022/01/NVIDIA-logo.jpg",# Or you can pass in a base64 encoded image# "url": "data:image/png;base64,<base64_encoded_image>",},},],}],model="NVILA-15B",
)
print(response.choices[0].message.content)

1. docker的尝试

看起来很棒,既然如此,先看看理论上最省事的docker方案。

按照官方页面引导编译用于python SDK访问的docker……啊?不是直接提供的docker镜像而是要自己编译的吗???

docker build -t vila-server:latest .

不出意外的发生报错:

=> [6/8] COPY environment_setup.sh environment_setup.sh                                                                                                                                0.0s=> ERROR [7/8] RUN bash environment_setup.sh vila                                                                                                                                      2.9s
------> [7/8] RUN bash environment_setup.sh vila:
2.779
2.779 CondaToSNonInteractiveError: Terms of Service have not been accepted for the following channels. Please accept or remove them before proceeding:
2.779     - https://repo.anaconda.com/pkgs/main
2.779     - https://repo.anaconda.com/pkgs/r
2.779
2.779 To accept these channels' Terms of Service, run the following commands:
2.779     conda tos accept --override-channels --channel https://repo.anaconda.com/pkgs/main
2.779     conda tos accept --override-channels --channel https://repo.anaconda.com/pkgs/r
2.779
2.779 For information on safely removing channels from your conda configuration,
2.779 please see the official documentation:
2.779
2.779     https://www.anaconda.com/docs/tools/working-with-conda/channels
2.779
------1 warning found (use docker --debug to expand):- LegacyKeyValueFormat: "ENV key=value" should be used instead of legacy "ENV key value" format (line 9)
Dockerfile:14
--------------------12 |13 |     COPY environment_setup.sh environment_setup.sh14 | >>> RUN bash environment_setup.sh vila15 |16 |
--------------------
ERROR: failed to solve: process "/bin/sh -c bash environment_setup.sh vila" did not complete successfully: exit code: 1

解决办法:
1、打开项目路径下的Dockerfile文件,将内容修改为:

FROM nvcr.io/nvidia/pytorch:24.06-py3WORKDIR /appRUN curl https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -o ~/miniconda.sh \&& sh ~/miniconda.sh -b -p /opt/conda \&& rm ~/miniconda.shENV PATH=/opt/conda/bin:$PATH
COPY pyproject.toml pyproject.toml
COPY llava llavaCOPY environment_setup.sh environment_setup.sh
RUN conda tos accept --override-channels --channel https://repo.anaconda.com/pkgs/main && \conda tos accept --override-channels --channel https://repo.anaconda.com/pkgs/r
RUN bash environment_setup.sh vilaCOPY server.py server.py
CMD ["conda", "run", "-n", "vila", "--no-capture-output", "python", "-u", "-W", "ignore", "server.py"]

即修改了旧版的环境变量写法:

ENV PATH=/opt/conda/bin:$PATH

并添加了两行conda新版必须要手动通过的许可:

RUN conda tos accept --override-channels --channel https://repo.anaconda.com/pkgs/main && \conda tos accept --override-channels --channel https://repo.anaconda.com/pkgs/r

再次运行编译命令:

docker build -t vila-server:latest .

编译成功。

然后发现这居然只是一个开始,后面全都是报错,官方你到底写的什么破文档啊啊啊
一顿折腾之后,发现在docker里面调起来实在是太麻烦了,还是先走本地部署python的路子走通吧。

2. 本地部署服务端

首先看一下官方的操作说明:
安装环境

./environment_setup.sh vila
conda activate vila

运行服务端

python -W ignore server.py \--port 8000 \--model-path Efficient-Large-Model/NVILA-15B \--conv-mode auto

然后就可以访问了,这也太简单了吧【?
结果没想到,看似只有2步的简单安装说明其实简直是地狱。

因为众所周知的原因,国内安装环境下载极慢,为了加快速度,打开./environment_setup.sh,给里面所有pip install的指令末尾都加上清华源:

 -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple

漫长的等待之后,./environment_setup.sh运行完成,运行,报错,一气呵成:

No module named 'ps3'

不是,哥们,你们写环境安装脚本还能漏写环境的吗?
在issue里面找到了十分有用的帖子,一位回答问题的老哥不仅指出了如何修复,还指出了他后面遇到的好几个问题……结果后面还真全都遇到了,一个都没少……
https://github.com/NVlabs/VILA/issues/258
不过那是后话,首先解决目前遇到的模块缺失问题:

pip install ps3-torch

再次运行,结果triton的代码报错了,好在刚刚帖子里面的老哥已经指出了如何处理:

pip install triton==3.3.1

这样改完之后的environment_setup.sh就变成了:

#!/usr/bin/env bash
set -eCONDA_ENV=${1:-""}
if [ -n "$CONDA_ENV" ]; then# This is required to activate conda environmenteval "$(conda shell.bash hook)"conda create -n $CONDA_ENV python=3.10.14 -yconda activate $CONDA_ENV# This is optional if you prefer to use built-in nvccconda install -c nvidia cuda-toolkit -y
elseecho "Skipping conda environment creation. Make sure you have the correct environment activated."
fi# This is required to enable PEP 660 support
pip install --upgrade pip setuptools -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple# Install FlashAttention2
pip install https://github.com/Dao-AILab/flash-attention/releases/download/v2.5.8/flash_attn-2.5.8+cu122torch2.3cxx11abiFALSE-cp310-cp310-linux_x86_64.whl -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple# Install VILA
pip install -e ".[train,eval]" -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simplepip install ps3-torch -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple# Quantization requires the newest triton version, and introduce dependency issue
pip install triton==3.3.0 -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple# numpy introduce a lot dependencies issues, separate from pyproject.yaml
# pip install numpy==1.26.4# Replace transformers and deepspeed files
site_pkg_path=$(python -c 'import site; print(site.getsitepackages()[0])')
cp -rv ./llava/train/deepspeed_replace/* $site_pkg_path/deepspeed/# Downgrade protobuf to 3.20 for backward compatibility
pip install protobuf==3.20.* -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple

终于,把conda的vila虚拟环境装完了,然后开始运行服务器……
等等?什么玩意要下载一万年?原来是参数中的Efficient-Large-Model/NVILA-15B这个模型啊。
那可不行,国内下载这个根本下不动,顺便又翻了一下,发现这个模型太大了,本地的显卡配置完全跑不起,那就去镜像站整一个小点的模型吧。
于是尝试了一下它的缩小版:

git clone https://modelscope.cn/models/Efficient-Large-Model/NVILA-8B

下载完之后,尝试运行服务端……启动!完美,出现了服务端地址与端口,然后运行官方的API访问脚本……报错!

openai.UnprocessableEntityError: Error code: 422 - {'detail': [{'loc': ['body', 'model'], 'msg': "unexpected value; permitted: 'NVILA-15B', 'VILA1.5-3B', 'VILA1.5-3B-AWQ', 'VILA1.5-3B-S2', 'VILA1.5-3B-S2-AWQ', 'Llama-3-VILA1.5-8B', 'Llama-3-VILA1.5-8B-AWQ', 'VILA1.5-13B', 'VILA1.5-13B-AWQ', 'VILA1.5-40B', 'VILA1.5-40B-AWQ'", 'type': 'value_error.const', 'ctx': {'given': 'NVILA-8B', 'permitted': ['NVILA-15B', 'VILA1.5-3B', 'VILA1.5-3B-AWQ', 'VILA1.5-3B-S2', 'VILA1.5-3B-S2-AWQ', 'Llama-3-VILA1.5-8B', 'Llama-3-VILA1.5-8B-AWQ', 'VILA1.5-13B', 'VILA1.5-13B-AWQ', 'VILA1.5-40B', 'VILA1.5-40B-AWQ']}}]}

翻了一下项目源码,发现它只支持部分llm……但奇葩的是,你连Llama都支持了,为什么唯独不支持一下官方示例的缩小版NVILA-8B?
有点无语,但翻了一下源码感觉改起来风险有点高,那就认输,换一个它有提供支持的小模型。

git clone https://modelscope.cn/models/Efficient-Large-Model/VILA1.5-3b

结果,它又又又报错了!

ValueError: Cannot use chat template functions because tokenizer.chat_template is not set and no template argument was passed! For information about writing templates and setting the tokenizer.chat_template attribute, please see the documentation at https://huggingface.co/docs/transformers/main/en/chat_templating

查了一下,发现这是新版本transformers不再提供旧版本默认的对话模板导致的,需要手动改一下。
于是,进入下载的模型文件夹里面的文件VILA1.5-3B/llm/tokenizer_config.json,在json的末尾添加一行属性:

"chat_template": "{% if messages[0]['role'] != 'system' %}{{ '<|im_start|>system\nYou are a helpful assistant<|im_end|>\n' }}{% endif %}{% for message in messages if message['content'] is not none %}{{ '<|im_start|>' + message['role'] + '\n' + message['content'] + '<|im_end|>' + '\n' }}{% endfor %}{% if add_generation_prompt %}{{ '<|im_start|>assistant\n' }}{% endif %}"

再次尝试运行……它又报错了,已经有点麻木了。

openai.UnprocessableEntityError: Error code: 422 - {'detail': [{'loc': ['body', 'model'], 'msg': "unexpected value; permitted: 'NVILA-15B', 'VILA1.5-3B', 'VILA1.5-3B-AWQ', 'VILA1.5-3B-S2', 'VILA1.5-3B-S2-AWQ', 'Llama-3-VILA1.5-8B', 'Llama-3-VILA1.5-8B-AWQ', 'VILA1.5-13B', 'VILA1.5-13B-AWQ', 'VILA1.5-40B', 'VILA1.5-40B-AWQ'", 'type': 'value_error.const', 'ctx': {'given': 'VILA1.5-3b', 'permitted': ['NVILA-15B', 'VILA1.5-3B', 'VILA1.5-3B-AWQ', 'VILA1.5-3B-S2', 'VILA1.5-3B-S2-AWQ', 'Llama-3-VILA1.5-8B', 'Llama-3-VILA1.5-8B-AWQ', 'VILA1.5-13B', 'VILA1.5-13B-AWQ', 'VILA1.5-40B', 'VILA1.5-40B-AWQ']}}]}

这次有点迷惑,我使用的VILA1.5-3b明明是列表里面的,为什么无法通过呢?
折腾了好久,震惊地发现了一个事实,下载下来的模型是VILA1.5-3b,而源码允许的模型是VILA1.5-3B……
对的,字母B的大小写不一样……不是,哥们,你们到底写的啥啊?

还是那句话,改源码风险不确定,最后想出一个办法,就是把下载下来的模型文件夹重命名:VILA1.5-3B
居然真的管用?

于是,愉快地再次尝试运行服务端推理……也毫不意外地又报错了。

openai.InternalServerError: Error code: 500 - {'error': 'Invalid style: SeparatorStyle.AUTO'}

……去github上翻了一下issue
https://github.com/NVlabs/VILA/issues/160
其中提到了这个问题,然后有人回复了这么一句……

It seems that we haven't found a solution to this problem yet

啊???
不过,后面他们又补充了一句:

offical serving scripts are uploaded:https://github.com/NVlabs/VILA/tree/main/serving

进入页面,发现里面写着运行服务端的方式:

# launch server
python serving/server.py --port 8001 --model-path Efficient-Large-Model/NVILA-15B --conv-mode auto

这和你们首页上写的都已经完全不是同一个脚本了好吧???

于是,尝试了一下这个启动写法:

python -W ignore serving/server.py   --port 8000     --model-path ./model/VILA1.5-3B  --conv-mode auto

成功解决了刚才的报错,但是又出现了新的问题……

from llava.constants import (
ImportError: cannot import name 'DEFAULT_IM_END_TOKEN' from 'llava.constants' (VILA/llava/constants.py)

于是给serving/server.py文件里面加了导入:

import sys
sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), ".."))

报错依旧,有点奇怪,看了一眼VILA/llava/constants.py里面根本没有这个变量……
又回到serving/server.py里面,发现这个变量除了import的地方之外,根本就没用到过……
=-= 你们到底在写什么东西啊?
很快发现它并不是唯一的同类,一顿改完后,serving/server.py里面注释掉了一堆不存在也没有任何用处的导入:

from llava.constants import (# DEFAULT_IM_END_TOKEN,# DEFAULT_IM_START_TOKEN,DEFAULT_IMAGE_TOKEN,# IMAGE_PLACEHOLDER,# IMAGE_TOKEN_INDEX,
)

再次执行:

python -W ignore serving/server.py   --port 8000     --model-path ./model/VILA1.5-3B  --conv-mode auto

然后运行官方的openAI式API访问。
谢天谢地,这次终于运行并成功返回了对图像内容的描述结果:

Assistant:  The image is a collage of two distinct photos. On the left, there's a man dressed in a black leather jacket and glasses. He appears to be in the middle of a speech or presentation, as he is gesturing with his hands. The background behind him is blurred, suggesting a focus on the man and his actions.On the right side of the image, there's a logo for NVIDIA. The logo is a stylized representation of a green spiral, which is a common symbol for NVIDIA. The word "NVIDIA" is written in white letters beneath the logo, clearly indicating the company's identity.The two images are placed side by side, creating a juxtaposition between the man's presentation and the NVIDIA logo. The man's action of speaking and the logo's static nature create a contrast between the dynamic and the static, the human and the corporate.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/94931.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/94931.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python爬虫: 分布式爬虫架构讲解及实现

了解Python分布式爬虫框架及其实现,能让你在处理大规模数据采集时事半功倍。本文我会结合自己的知识,从核心原理、主流框架、关键技术到实践建议,为你提供一个详细的解读。 🧠 一、分布式爬虫核心原理 分布式爬虫的核心思想是将爬取任务分解,由多个爬虫节点(Worker)协…

君正T31学习(四)- MT7682+VLC出图

一、简介 前几篇文章介绍了如何通过SD卡来播放sensor录制的视频&#xff0c;但是效率很低&#xff0c;所以需要一种效率更高的方法&#xff0c;就是本篇的主角MT7682VLC。 Mt7682在系统中注册为一个以太网卡驱动&#xff0c;接口名为eth0&#xff0c;可以使用Linux通用的socket…

【办公自动化】如何使用Python库高效自动化处理图像?

在日常办公中&#xff0c;我们经常需要处理大量图像&#xff0c;如产品照片、营销素材、文档扫描件等。手动处理这些图像不仅耗时&#xff0c;还容易出错。通过Python自动化图像处理&#xff0c;我们可以高效地完成批量缩放、裁剪、加水印、格式转换等任务&#xff0c;大大提高…

Beats与Elasticsearch高效数据采集指南

Beats 是 Elastic Stack 中的数据采集器&#xff0c;用于从各种来源&#xff08;日志、指标、网络数据等&#xff09;轻量级收集数据&#xff0c;而 Elasticsearch 是搜索和分析引擎&#xff0c;负责存储、索引和快速检索数据。二者结合可搭建强大的数据分析管道&#xff08;如…

前端异常监控,性能监控,埋点,怎么做的

你想做的是一个 前端监控系统&#xff08;Frontend Monitoring / RUM, Real User Monitoring&#xff09;&#xff0c;主要包括&#xff1a;异常监控&#xff08;JS 报错、资源加载错误、Promise 未捕获异常&#xff09;性能监控&#xff08;白屏时间、首屏时间、页面加载时间、…

Kubernetes一EFK日志架构

前言&#xff1a;​ 在云原生时代&#xff0c;Kubernetes已成为容器编排的事实标准&#xff0c;它赋予了应用极高的弹性、可移植性和密度。然而&#xff0c;这种动态、瞬时的特性也带来了可观测性的新难题&#xff1a;当数以百计的Pod在节点间频繁创建和销毁时&#xff0c;传统…

Linux下的软件编程——网络编程(tcp)

重点&#xff1a;1.UDP和TCP区别2.TCP三次握手和四次挥手3.TCP粘包问题及解决办法4.TCP客户端和服务端的编程流程 TCP&#xff1a;传输层传输控制协议&#xff08;流式套接字&#xff09;1&#xff09;TCP的特点1.面向数据流2.有连接&#xff08;通信之前必须建立连接…

印度尼西亚数据源 PHP 对接文档

一、环境要求与配置 1. 系统要求 PHP ≥ 7.4扩展&#xff1a;cURL、JSON、OpenSSLComposer&#xff08;推荐&#xff09; 2. 安装依赖 composer require guzzlehttp/guzzle3. 基础配置类 <?php // config/StockTVConfig.php class StockTVConfig {const BASE_URL https://…

Maven核心用法

1.什么是Maven2.Maven的作用&#xff08;依赖管理、项目构建、统一的项目结构&#xff09;2.1 依赖管理2.2 项目构建2.3 统一的项目结构3.Maven的介绍IDEA中对应信息4.Maven的安装注意&#xff1a;需要解压到 没有中文 不带空格 的目录下5.IDEA中的Maven配置然后需要配置JD…

TypeScript:never类型

never类型是TypeScript中最特殊的类型之一&#xff0c;它表示永远不会发生的值。作为专业前端工程师&#xff0c;理解never类型对于编写类型安全的代码至关重要。1. never类型的核心概念定义&#xff1a;never类型表示永远不会出现的值&#xff0c;常见于&#xff1a;抛出错误的…

图数据库neo4j的安装

安装JDK Neo4j是基于Java的图形数据库&#xff0c;运行Neo4j需要启动JVM进程&#xff0c;因此必须安装JAVA SE的JDK。从Oracle官方网站下载 Java SE JDK&#xff0c;我的的版本是JDK8。 安装Neo4j 官网下载最新版本Neo4j 我下的是社区版的 Neo4j应用程序有如下主要的目录结构…

汽车诊断服务(UDS——0x27服务解析)

目录 1、服务概述 2、工作原理 3、常用的应用场景 4、子功能 5、请求与响应格式 5、1服务请求 5、2服务肯定响应 5、3服务否定响应 6、延时机制 1、服务概述 该服务对零部件中部分加密的服务进行解密工作安全访问的概念使用“种子”和“密钥”来实现 参数描述种子4字…

波兰密码破译机bomba:二战密码战的隐形功臣

本文由「大千AI助手」原创发布&#xff0c;专注用真话讲AI&#xff0c;回归技术本质。拒绝神话或妖魔化。搜索「大千AI助手」关注我&#xff0c;一起撕掉过度包装&#xff0c;学习真实的AI技术&#xff01; 从数学原理到机械奇迹&#xff0c;破解enigma的早期利器 ✨ 1. bomba概…

【RAGFlow代码详解-30】构建系统和 CI/CD

Docker 构建系统 RAGFlow 使用主 Dockerfile 1-214 中定义的复杂多阶段 Docker 构建过程&#xff0c;该过程创建应用程序的完整和精简变体。 多阶段构建架构Docker 构建过程 构建过程由 Dockerfile 2-214 中 定义的三个主要阶段组成&#xff1a;基础阶段 &#xff08; Dockerfi…

rust语言 (1.88) egui (0.32.1) 学习笔记(逐行注释)(十七)设置主题

设置主题set_visuals ctx.set_visuals(Visuals::dark()); 设置暗色主题ctx.set_visuals(Visuals::light()); 设置亮色主题 fn main() -> eframe::Result<()> {// 配置原生窗口参数let options eframe::NativeOptions::default();eframe::run_simple_native("主题…

Linux入门教程 第十五章 Linux 系统调优工具

文章目录一、系统调优概述与 CPU 负载查看1.使用 uptime 查看系统负载2.使用 top 按 CPU 使用率排序3.使用 ps 查看 CPU 使用最多的进程4.使用 mpstat 查看 CPU 详细状态一、查看内存运行状态1.使用 free 查看内存使用2.查看 /proc/meminfo 获取详细内存信息3.使用 top 按内存使…

【Docker基础】Docker-compose进阶配置:健康检查与服务就绪

目录 引言 1 Docker健康检查基础概念 1.1 什么是健康检查 1.2 健康检查的状态 2 healthcheck配置详解 2.1 基本语法 2.2 配置参数解释 2.3 健康检查命令的编写 2.4 健康检查的工作流程 3 服务依赖与健康检查 3.1 depends_on的基本用法 3.2 结合健康检查的依赖 3.3…

Redis大Key处理流程与注意事项

概述 Redis大Key问题是在生产环境中经常遇到的技术挑战&#xff0c;它可能导致内存占用过高、网络延迟增加、阻塞其他操作等严重问题。本文将深入探讨Redis大Key的识别、处理流程以及相关注意事项。 什么是Redis大Key 定义标准 String类型: 单个Key的Value超过10KBHash类型: 单…

领悟8种常见的设计模式

很多 Java 初学者觉得设计模式 “抽象难学”&#xff0c;其实是没抓住核心逻辑 —— 设计模式不是 “炫技代码”&#xff0c;而是前辈们总结的 “解决高频复杂问题的通用思路”&#xff0c;好吧&#xff0c;你可以过一遍了解这些大概是个什么东西不求我们能够完全理解&#xff…

复杂BI报表SQL

复杂SQL 一行多个人员&#xff0c;平均瓜分总产量。 -- 西宁硅料三期 with b as ( select(row_number() OVER(PARTITION BY t1.tool ORDER BY t1.tool ) - 1) AS help_topic_id from((select1 AS tool union allselect1 AS tool union allselect1 AS tool union allselect1 AS …