本地环境配置

利用conda创建一个Python虚拟环境

conda create -n janus_pro python=3.9
conda activate janus_pro

在新建的环境里安装支持cuda的torch和torchvision

python -m pip install torch2.0.1+cu118 --index-url https://download.pytorch.org/whl/cu118
python -m pip install torchvision
0.15.2+cu118 --index-url https://download.pytorch.org/whl/cu118

Janus-Pro项目clone到本地,然后cd到项目文件夹下:

cd C:\Users\15359\Desktop\Janus-main\Janus-main

将requirements.txt的前两行删除,修改为:

transformers>=4.38.2
timm>=0.9.16
accelerate
sentencepiece
attrdict
einops

gradio3.48.0
gradio-client
0.6.1
mdtex2html1.3.0
pypinyin
0.50.0
tiktoken0.5.2
tqdm
4.64.0
colorama0.4.5
Pygments
2.12.0
markdown3.4.1
SentencePiece
0.1.96

然后安装:

python -m pip install -r requirements.txt

等待完成后,再安装

python -m pip install gradio

将demo文件夹中的app_januspro.py复制到主目录下,运行。

预训练的模型在这里,会自动下载:
Janus-Pro-7B
需要换模型的话,只需要修改 app_januspro.py 里面的:

model_path = "deepseek-ai/Janus-Pro-1B"

本地使用cuda的时候,我的GPU遇到一些问题,需要把app_januspro.py里面的l torch.float16 改成 torch.bfloat16 才能正常工作。

服务器环境配置

访问Gradio的URL连接

Pycharm专业版 + SSH远程开发,需要从本地访问服务器上为Gradio界面创立的URL连接。

方法1:生成Gradio Live共享链接(失败,我的服务器网络环境不支持)

在服务器的python环境下,升级Gradio至最新版本:

pip install --update gradio

然后运行,会提示缺少一个文件:frpc_linux_amd64_v0.2

按照提示的链接下载这个文件,放到指定的目录下,我的目录是:

/home/hyk/anaconda3/envs/janus/lib/python3.9/site-packages/gradio/

修改main.py文件 “share=True” ,创立共享链接:

demo.launch(server_name="0.0.0.0", server_port=7860, share=True)

方法2:使用SSH端口转发(成功)

假设服务器创立的URL连接为: http://127.0.0.1:7860

服务器IP为 xxx.xxx.x.xxx

在服务器登录使用的端口为 abcd

在本地电脑上打开CMD或PowerShell。使用SSH端口转发连接到服务器,并将7860端口转发到本地:

ssh -L 7860:127.0.0.1:7860 服务器用户名@服务器IP(xxx.xxx.x.xxx) -p 服务器的登录端口(abcd)

然后会要求输入登录服务器的密码。

SSH 会话开启后,本地 7860 端口将与服务器的 7860 端口连接。保持 SSH 会话打开。

在本地浏览器访问:

http://127.0.0.1:7860

这将会把本地请求转发到服务器上的 7860 端口。

HuggingFace缓存设置

由于我的服务器网络问题,无法直接从HuggingFace下载预训练模型,因此我需要把下载好的模型手动上传至服务器,再指定HuggingFace的缓存目录。

Janus-Pro-1B

直接在.py文件中,指定本地目录:

local_model_path = "/media/HDD/hyk/hub/models--deepseek-ai--Janus-Pro-1B/snapshots/960ab33191f61342a4c60ae74d8dc356a39fafcb/"
config = AutoConfig.from_pretrained(local_model_path)
language_config = config.language_config
language_config._attn_implementation = 'eager'
vl_gpt = AutoModelForCausalLM.from_pretrained(local_model_path,
                                             language_config=language_config,
                                             trust_remote_code=True, local_files_only=True)

需要注意的是, 本地 local_model_path 目录应该包含以下文件(可能有额外文件,但这些是最基本的):

/your/local/path/Janus-Pro-1B/
│── config.json
│── pytorch_model.bin # 或 safetensors 格式
│── tokenizer.json
│── tokenizer_config.json
│── vocab.txt # 如果有的话
│── special_tokens_map.json
│── generation_config.json # 可能有
│── model.safetensors # 如果模型是 safetensors 格式

因此,snapshots/ 目录下的哈希值文件夹内,才是真正的模型文件,因此,需要把 model_path 替换成本地 snapshots 路径,即:

local_model_path = "/media/HDD/hyk/hub/models--deepseek-ai--Janus-Pro-1B/snapshots/960ab33191f61342a4c60ae74d8dc356a39fafcb/"

此外,可以通过设置“ local_files_only=True”,强行让from_pretrained不联网,只从本地加载。

此外,我在服务器上的缓存路径跟别人冲突了,因此可以重新设置一下gradio的缓存:

os.environ["GRADIO_TEMP_DIR"] = "tmp/gradio_cache"

@torch.inference_mode()
# @spaces.GPU(duration=120)  # Specify a duration to avoid timeout
def generate_image(prompt,
                   seed=None,
                   guidance=5,
                   t2i_temperature=1.0):

服务器直接运行app_januspro.py没有问题,不需要修改里面的 torch.float16。

Janus-Pro-7B

同样在.py文件中,直接指定本地目录:

local_model_path = "/media/HDD/hyk/hub/models--deepseek-ai--Janus-Pro-7B/snapshots/5c3eb3fb2a3b61094328465ba61fcd4272090d67/"

但是我在这里遇到一些问题,我之前缓存的snapshots缺少一些文件。从deepseek-Janus-Pro-7B重新下载缺少的文件,主要是.json文件,放回上面的“local_model_path ”目录下。

请添加图片描述

程序就可以正常运行了。

Janus-Pro-7B 与 Janus-Pro-1B 功能对比

指定Janus-Pro-1B的GPU

为了同时运行两个Janus-Pro,我们指定Janus-Pro-1B的GPU是“cuda:2"

# Load model and processor
local_model_path = "/media/HDD/hyk/hub/models--deepseek-ai--Janus-Pro-1B/snapshots/960ab33191f61342a4c60ae74d8dc356a39fafcb/"

config = AutoConfig.from_pretrained(local_model_path)
language_config = config.language_config
language_config._attn_implementation = 'eager'
vl_gpt = AutoModelForCausalLM.from_pretrained(local_model_path,
                                             language_config=language_config,
                                             trust_remote_code=True, local_files_only=True,
                                             )
if torch.cuda.is_available():
    vl_gpt = vl_gpt.to(torch.bfloat16).cuda(device = 'cuda:2')
else:
    vl_gpt = vl_gpt.to(torch.float16)

vl_chat_processor = VLChatProcessor.from_pretrained(local_model_path)
tokenizer = vl_chat_processor.tokenizer
cuda_device = 'cuda:2' if torch.cuda.is_available() else 'cpu'
同时转发两个端口

之后,可以打开多个终端窗口,每个窗口运行一个 ssh -L 命令,同时转发Janus-Pro-7B和Janus-Pro-1B的端口。也可以在同一个 ssh 命令中使用多个 -L 选项:

ssh -L 8890:127.0.0.1:7860 -L 8891:127.0.0.1:7861 服务器用户名@服务器IP(xxx.xxx.x.xxx) -p 服务器的登录端口(abcd)

功能比较

左(Janus-Pro-7B) 右(Janus-Pro-1B)
请添加图片描述

Janus-Pro-7B更容易理解填鸭式的问题。当问题的限制比较多时,Janus-Pro-7B会严格遵循格式回答,Janus-Pro-1B会自由发挥。

请添加图片描述

请添加图片描述

Janus-Pro-7B的回答准确一些,更容易抓住关键词。这张图的预设关键词为 ‘interior’ 。
请添加图片描述

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐