立即注册找回密码

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

手机动态码快速登录

手机号快速注册登录

搜索

图文播报

查看: 2067|回复: 5

[分享] 如何看待 DeepSeek 深夜发布的全新多模态大模型 Janus-Pro-7B?带来了哪些影响?

[复制链接]
发表于 2025-1-28 20:01 | 显示全部楼层 |阅读模式

登陆有奖并可浏览互动!

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录 手机动态码快速登录

×
1月28日消息,爆火的国产大模型DeepSeek又放大招,今天凌晨突然发布Janus-Pro多模态大模型,进军文生图领域。
在GenEval和DPG-Bench基准测试中,Janus-Pro-7B不仅击败了OpenAI的DALL-E 3,还击败了Stable Diffusion、Emu3-Gen等热门模型。
Janus Pro采用MIT开源协议,这意味着可无限制用于商业场景。
DeepSeek方面表示,该大模型是2024年11月13日发布的JanusFlow大模型的高级版本。
相比前代模型,Janus-Pro优化训练策略、扩展了训练数据,模型也更大。
得益于此,Janus-Pro在多模态理解和文本到图像的指令跟踪功能方面取得重大进步,同时还增强了文本到图像生成稳定性。
虽然Janus-Pro暂时只能处理384x384分辨率的图像,但考虑到模型如此“紧凑”却能达到如此水准,足以令人惊艳。
作为多模态模型,Janus-Pro不仅能文生图,还能对图片进行描述,识别地标景点,识别图像中的文字,并能对图片中的知识进行介绍。

原文地址:https://www.zhihu.com/question/10723192745
楼主热帖
回复

使用道具 举报

发表于 2025-1-28 20:02 | 显示全部楼层
其实,DeepSeek在去年10月份就发布了Janus的第一个版本,这次新发布的Janus-Pro是上一个版本的升级版本。




Janus-Pro相比Janus架构没变,但是做了三个方面的优化。Janus是一个完全基于自回归架构的多模态生成和理解模型,其中用于图像理解部分的图像Encoder采用SigLip,而图像生成采用一个VQ tokenizer,将图像转成离散的tokens,这样就可以和文本tokens一起做自回归的生成了。


Janus-Pro相比Janus所做的第一个改进是优化了训练策略。Janus的训练分为三个阶段。第一阶段专注于训练适配器和图像头。第二阶段处理统一预训练,在此期间,除了理解编码器和生成编码器之外的所有组件的参数都会更新。第三阶段是监督微调,在第二阶段基础上通过在训练过程中进一步解锁理解编码器的参数。这种训练策略存在某些问题。在第二阶段,Janus按照PixArt的方法将文本到图像能力的训练分为两部分。第一部分在ImageNet数据上进行训练,使用图像类别名称作为文本到图像生成的提示,目的是建模像素依赖性。第二部分在正常的文本到图像数据上进行训练。其中后者文本到图像训练占比66.67%。而Janus-Pro是将ImageNet上训练放到了第一阶段,并增加训练时长,第二阶段只用文生图数据专注训练。而且在第三阶段的监督微调过程中调整了不同类型数据集的数据比例,将多模态数据、纯文本数据和文本到图像数据的比例从7:3:10调整为5:1:4。通过略微减少文本到图像数据的比例,不仅能保持强大视觉生成能力的同时,还可以进一步优化其他方面的性能。
第二个改进是扩展数据,增加多模态理解数据和文生图数据。
Janus-Pro做的最后一个改进是扩展模型参数,原来的Janus用的是1.5B的LLM,现在升级为7B LLM。


最新的Janus-Pro-7B无论是图像理解还是图像生成都能达到很好的效果。




不过对于图像生成,目前只能生成低分辨率图像,而且这里的GenEval和DPG都是主要评测文本following能力,并不能很好衡量图像生成视觉质量。在视觉质量方面,现在的Janus-Pro-7B肯定还不如SOTA的扩散模型如Flux。
下面是一些实测例子(第一个Flux dev,第二个是Janus-Pro-7B):
photo of three antique dragon glass magic potions in an old abandoned apothecary shop: the first one is blue with the label "1.5", the second one is red with the label "SDXL", the third one is green with the label "SD3".





a close-up half-portrait photo of a woman wearing a sleek blue and white summer dress with a monstera plant motif, has square white glasses, green braided hair, she is on Brighton pebble beach UK, west pier behind her, early in the morning, seagulls flying overhead




可以看到,文本following能力方面,Janus-Pro-7B确实不错,但是图像生成质量方面,还是差于现在开源的SOTA模型Flux dev。
只能说自回归式图像生成任重而道远。但是,长期我依然看好Janus这种统一多模态理解和生成的模型,希望2025年有新的突破。
回复 支持 反对

使用道具 举报

发表于 2025-1-28 20:03 | 显示全部楼层
DeepSeek前脚刚发布R1模型,又赶在大年三十发布了最新的多模态大模型Janus-Pro-7B,支持理解生成图像,这可能又是一个爆炸性的产品,要知道R1已经在海外火的一塌糊涂,让英伟达股票大跌10%以上,连ChatGPT都回应:排名变化也许是暂时的。
先看看官方展示的文生图demo,效果还是相当可以。




Janus-Pro-7B是在Janus(24年11月发布)基础上升级的,并非全新产品,这一次优化了训练策略,扩大了训练数据,模型规模也更大,因此不管是多模态理解还是文生图能力都强大很多。


大家可以看下上面多模态模型相关的两项性能对比。
左边的图用来评价多模态模型在四个多模态理解基准测试上的平均性能,横轴为大语言模型(LLM)参数数量(单位为十亿),纵轴为平均性能。
和LLaVA - v1.5 - 7B+、VILA - U、Emu3 - Chat、LLaVA - v1.5 - Phi - 1.5、Show - o 相比,Janus-Pro-7B有明显的性能优势。
右边的图用来评价模型在文生图指令跟随基准测试(GenEval 和 DPG - Bench)上的准确率, 两项指标都超过了DALL・E 3、Emu3 - Gen、SDXL、Pika - v1 - 0、SD3 - Medium、SDV1.5等模型。
从技术上看,Janus-Pro-7B采用了一种全新的自回归框架,把视觉编码分成不同路径,分别来处理多模态理解和文生图,两个任务互不干扰,能避免混乱,图像理解和生成质量会更高。
怎么理解呢?传统模型是一个人干两个人的活(理解和生成),而Janus-Pro-7B则是派两个人分别做理解和生成图像这两件事,这样增强了整个框架的灵活性,能更好地应对不同的情况。



现在DeepSeek网页版和手机端都还不支持文生图功能,似乎只可以下载模型后做本地部署。


# Load model directly
from transformers import AutoModel
model = AutoModel.from_pretrained("deepseek-ai/Janus-Pro-7B")上面这段代码用来加载预训练模型,transformers 库会自动从 Hugging Face 模型库中下载 Janus-Pro-7B 模型的权重文件,并加载到内存中。
然后使用加载的模型进行文生图等操作,具体我还没来得及测试,后面抽时间玩玩。
以下是官方示例的注释版,我做了中文备注,大家可以看看。
首先是多模态理解的代码,也就是图像识别。
import torch
# 从transformers库中导入用于因果语言模型的类
from transformers import AutoModelForCausalLM
# 从janus.models模块中导入多模态因果语言模型和VLChat处理器
from janus.models import MultiModalityCausalLM, VLChatProcessor
# 从janus.utils.io模块中导入加载PIL图像的函数
from janus.utils.io import load_pil_images

# 指定要使用的模型路径,这里使用的是deepseek-ai组织的Janus-Pro-7B模型
model_path = "deepseek-ai/Janus-Pro-7B"
# 从指定路径加载VLChat处理器,该处理器用于处理多模态对话的输入
vl_chat_processor: VLChatProcessor = VLChatProcessor.from_pretrained(model_path)
# 从VLChat处理器中获取分词器,用于将文本转换为模型可接受的输入格式
tokenizer = vl_chat_processor.tokenizer

# 从指定路径加载多模态因果语言模型
vl_gpt: MultiModalityCausalLM = AutoModelForCausalLM.from_pretrained(
    model_path, trust_remote_code=True  # 允许加载远程代码,因为模型可能依赖一些自定义的代码
)
# 将模型的数据类型转换为bfloat16,以减少内存使用和加速计算
vl_gpt = vl_gpt.to(torch.bfloat16)
# 将模型移动到GPU上进行计算
vl_gpt = vl_gpt.cuda()
# 将模型设置为评估模式,关闭一些在训练时使用的特殊操作(如Dropout)
vl_gpt = vl_gpt.eval()

# 定义一个对话列表,模拟用户和模型之间的交互
conversation = [
    {
        # 表示这是用户的发言
        "role": "<|User|>",
        # 用户的发言内容,<image_placeholder>表示此处有一张图片,question是用户的文本问题
        "content": f"<image_placeholder>\n{question}",
        # 用户提供的图片列表,这里假设image是一个有效的图像对象
        "images": [image],
    },
    {
        # 表示这是助手(模型)的发言,初始内容为空,等待模型生成回复
        "role": "<|Assistant|>",
        "content": ""
    },
]


# 调用load_pil_images函数加载对话中涉及的图片,并将其转换为PIL图像对象
pil_images = load_pil_images(conversation)
# 使用VLChat处理器对对话和图像进行处理,将其转换为模型可接受的输入格式
# force_batchify=True表示强制进行批量处理
prepare_inputs = vl_chat_processor(
    conversations=conversation, images=pil_images, force_batchify=True
).to(vl_gpt.device)  # 将处理后的输入移动到与模型相同的设备上

# 调用模型的prepare_inputs_embeds方法,对处理后的输入进行编码,得到图像嵌入表示
inputs_embeds = vl_gpt.prepare_inputs_embeds(**prepare_inputs)
# 使用模型的语言模型部分进行生成,得到回复的输出
outputs = vl_gpt.language_model.generate(
    inputs_embeds=inputs_embeds,  # 输入的嵌入表示
    attention_mask=prepare_inputs.attention_mask,  # 注意力掩码,用于指示哪些位置需要关注
    pad_token_id=tokenizer.eos_token_id,  # 填充标记的ID,这里使用结束标记的ID
    bos_token_id=tokenizer.bos_token_id,  # 开始标记的ID
    eos_token_id=tokenizer.eos_token_id,  # 结束标记的ID
    max_new_tokens=512,  # 最大生成的新标记数量
    do_sample=False,  # 不使用采样策略,采用贪心搜索生成
    use_cache=True  # 使用缓存以加速生成过程
)

# 将模型生成的输出解码为文本,跳过特殊标记
answer = tokenizer.decode(outputs[0].cpu().tolist(), skip_special_tokens=True)
# 打印格式化的输入和模型生成的回复
print(f"{prepare_inputs['sft_format'][0]}", answer)接着是文生图的代码。
import os
import PIL.Image
import torch
import numpy as np
from transformers import AutoModelForCausalLM
from janus.models import MultiModalityCausalLM, VLChatProcessor

# 指定要使用的模型路径,这里使用的是 deepseek-ai 组织的 Janus-Pro-7B 模型
model_path = "deepseek-ai/Janus-Pro-7B"
# 从指定路径加载 VLChat 处理器,该处理器用于处理多模态对话的输入
vl_chat_processor: VLChatProcessor = VLChatProcessor.from_pretrained(model_path)
# 从 VLChat 处理器中获取分词器,用于将文本转换为模型可接受的输入格式
tokenizer = vl_chat_processor.tokenizer

# 从指定路径加载多模态因果语言模型
vl_gpt: MultiModalityCausalLM = AutoModelForCausalLM.from_pretrained(
    model_path, trust_remote_code=True  # 允许加载远程代码,因为模型可能依赖一些自定义的代码
)
# 将模型的数据类型转换为 bfloat16,以减少内存使用和加速计算
vl_gpt = vl_gpt.to(torch.bfloat16)
# 将模型移动到 GPU 上进行计算
vl_gpt = vl_gpt.cuda()
# 将模型设置为评估模式,关闭一些在训练时使用的特殊操作(如 Dropout)
vl_gpt = vl_gpt.eval()

# 定义一个对话列表,模拟用户和模型之间的交互
conversation = [
    {
        # 表示这是用户的发言
        "role": "<|User|>",
        # 用户的发言内容,描述了一个来自喀布尔,穿着红白传统服装,蓝眼睛、棕头发的迷人公主
        "content": "A stunning princess from kabul in red, white traditional clothing, blue eyes, brown hair",
    },
    {
        # 表示这是助手(模型)的发言,初始内容为空,等待模型生成回复
        "role": "<|Assistant|>",
        "content": ""
    },
]

# 对多轮对话提示应用 SFT(Supervised Fine-Tuning)模板
sft_format = vl_chat_processor.apply_sft_template_for_multi_turn_prompts(
    conversations=conversation,
    sft_format=vl_chat_processor.sft_format,
    system_prompt="",  # 系统提示为空
)
# 拼接图像开始标签,形成最终的提示
prompt = sft_format + vl_chat_processor.image_start_tag

# 使用 torch.inference_mode() 上下文管理器,禁用梯度计算,以提高推理速度
@torch.inference_mode()
def generate(
    mmgpt: MultiModalityCausalLM,  # 多模态因果语言模型
    vl_chat_processor: VLChatProcessor,  # VLChat 处理器
    prompt: str,  # 输入的提示文本
    temperature: float = 1,  # 温度参数,控制生成的随机性
    parallel_size: int = 16,  # 并行生成的图像数量
    cfg_weight: float = 5,  # 分类器自由引导(CFG)的权重
    image_token_num_per_image: int = 576,  # 每张图像的令牌数量
    img_size: int = 384,  # 生成图像的大小
    patch_size: int = 16,  # 图像块的大小
):
    # 使用分词器对提示文本进行编码,转换为模型可接受的输入 ID
    input_ids = vl_chat_processor.tokenizer.encode(prompt)
    # 将输入 ID 转换为 PyTorch 的 LongTensor 类型
    input_ids = torch.LongTensor(input_ids)

    # 创建一个形状为 (parallel_size*2, len(input_ids)) 的零张量,用于存储输入的令牌
    tokens = torch.zeros((parallel_size*2, len(input_ids)), dtype=torch.int).cuda()
    for i in range(parallel_size*2):
        # 将输入 ID 复制到每个样本中
        tokens[i, :] = input_ids
        # 对于奇数样本,将除首尾之外的令牌设置为填充 ID
        if i % 2 != 0:
            tokens[i, 1:-1] = vl_chat_processor.pad_id

    # 通过模型的输入嵌入层将令牌转换为嵌入向量
    inputs_embeds = mmgpt.language_model.get_input_embeddings()(tokens)

    # 创建一个形状为 (parallel_size, image_token_num_per_image) 的零张量,用于存储生成的图像令牌
    generated_tokens = torch.zeros((parallel_size, image_token_num_per_image), dtype=torch.int).cuda()

    # 逐令牌生成图像
    for i in range(image_token_num_per_image):
        # 运行模型,获取输出
        outputs = mmgpt.language_model.model(inputs_embeds=inputs_embeds, use_cache=True, past_key_values=outputs.past_key_values if i != 0 else None)
        # 获取模型的最后一层隐藏状态
        hidden_states = outputs.last_hidden_state

        # 通过生成头将隐藏状态转换为对数概率
        logits = mmgpt.gen_head(hidden_states[:, -1, :])
        # 分离条件对数概率和无条件对数概率
        logit_cond = logits[0::2, :]
        logit_uncond = logits[1::2, :]

        # 应用分类器自由引导(CFG)
        logits = logit_uncond + cfg_weight * (logit_cond - logit_uncond)
        # 对对数概率应用 softmax 函数,得到概率分布
        probs = torch.softmax(logits / temperature, dim=-1)

        # 根据概率分布采样下一个令牌
        next_token = torch.multinomial(probs, num_samples=1)
        # 将采样得到的令牌存储到生成的图像令牌张量中
        generated_tokens[:, i] = next_token.squeeze(dim=-1)

        # 复制下一个令牌,用于条件和无条件输入
        next_token = torch.cat([next_token.unsqueeze(dim=1), next_token.unsqueeze(dim=1)], dim=1).view(-1)
        # 准备生成图像的嵌入向量
        img_embeds = mmgpt.prepare_gen_img_embeds(next_token)
        # 调整图像嵌入向量的形状
        inputs_embeds = img_embeds.unsqueeze(dim=1)

    # 使用生成的视觉模型解码生成的图像令牌,得到图像的张量表示
    dec = mmgpt.gen_vision_model.decode_code(generated_tokens.to(dtype=torch.int), shape=[parallel_size, 8, img_size//patch_size, img_size//patch_size])
    # 将图像张量转换为浮点数类型,并移动到 CPU 上,调整维度顺序
    dec = dec.to(torch.float32).cpu().numpy().transpose(0, 2, 3, 1)

    # 将图像像素值缩放到 [0, 255] 范围
    dec = np.clip((dec + 1) / 2 * 255, 0, 255)

    # 创建一个形状为 (parallel_size, img_size, img_size, 3) 的零数组,用于存储可视化的图像
    visual_img = np.zeros((parallel_size, img_size, img_size, 3), dtype=np.uint8)
    visual_img[:, :, :] = dec

    # 创建一个名为 generated_samples 的目录,用于保存生成的图像
    os.makedirs('generated_samples', exist_ok=True)
    # 遍历每个生成的图像,保存为 JPEG 文件
    for i in range(parallel_size):
        save_path = os.path.join('generated_samples', "img_{}.jpg".format(i))
        PIL.Image.fromarray(visual_img).save(save_path)

# 调用生成函数,传入模型、处理器和提示
generate(
    vl_gpt,
    vl_chat_processor,
    prompt,
)
回复 支持 反对

使用道具 举报

发表于 2025-1-28 20:04 | 显示全部楼层
DeepSeek这个Janus-Pro-7B出来确实有点意思,尤其是看到它参数才7B,结果居然在GenEval和DPG-Bench上干翻了DALL-E 3和Stable Diffusion这种大佬。说实话,之前总觉得多模态模型没个几百亿参数根本玩不转,结果现在一个能在普通电脑上跑的模型突然冒出来,甚至还能生成384x384分辨率的图——虽然分辨率不算顶天,但对比一下它的小身板,感觉像是用五菱宏光跑出了保时捷的加速度,有点魔幻。

不过最让人摸不着头脑的还是市场反应,听说DeepSeek-R1刚发的时候英伟达美股夜盘直接崩了,后来又拉回来,结果Janus-Pro-7B一发布又给砸下去17%,市值蒸发五六千亿刀。虽然不知道是不是真的因为模型发布引发的连锁反应(毕竟美股波动鬼故事多),但至少说明有人开始担心这种轻量化路线会动摇现有算力霸主的地位——如果以后人人都能在自己电脑上跑AI生图,谁还去租昂贵的云端GPU啊?不过这种联想可能有点夸张,毕竟老黄家的显卡生态盘根错节,但资本市场有时候就爱听这种“颠覆叙事”。

功能上倒是挺接地气,既能理解图片又能生成图片,对搞设计的小团队或者个人创作者算是个好消息。以前用SD调个参数都得折腾半天显存,现在这玩意儿据说普通显卡就能带起来,说不定以后做自媒体的人随手就能搞点像样的配图。不过也有人吐槽384x384的分辨率放在今天不够看,毕竟行业里已经卷到1024x1024了,但想想它参数只有7B,可能是在细节和效率之间做了妥协吧。

现在最大的悬念其实是,这种轻量化模型到底能走多远。参数小了固然容易部署,但碰到复杂场景会不会露怯?比如你要生成一张“赛博朋克夜市里三只机械猫追着无人机打架”的图,它能不能处理好光影层次和动态细节?不过话说回来,大多数用户可能根本不需要那么极致的效果,能快速出个七八十分的可商用图就已经谢天谢地了。

总之DeepSeek这波操作像是给AI平民化撕开了一道口子。至于能不能撼动行业格局,就看他们后续能不能把生态搞起来,毕竟Stable Diffusion的成功一半靠技术,一半靠社区魔改。现在压力给到开源社区这边了,要是有人能把这7B的小模型调教成全能战士,那乐子可就大了。
回复 支持 反对

使用道具 举报

发表于 2025-1-28 20:04 | 显示全部楼层
7B的模型,它就是再牛逼,这么小的参数量的性能也非常的有限,就像不太可能用指甲刀刻个长城出来。
再加上这个发布模型的时间点,除夕+中国时间半夜,可以理解为痛击美股股市的一招明牌。
今天英伟达Nvidia股价跌了17%多。


纳斯达克跌了3%点多。


这么大的单日跌幅,始作俑者就是DeepSeek前段时间发布的V3和R1,可以说是用开源和纯粹的技术力痛击路径依赖的硅谷科技企业。
有卡的没卡的都不好过,有卡的巨头企业拿着几倍甚至几十倍于DeepSeek的卡,做不到类似的性能;卡少的更是惆怅,自己怎么就没有想到这些做法。
因为很多领域,第一个就是第一个,DeepSeek就拿了一个OpenAI时刻的牌,它的所有操作都会引起巨大的流量变化。
而deepseek的母公司恰好是搞金融的,那趁你病,要你命,再发布一个模型,估计是算准了明天股价还会应声下跌,再赚一笔。
这种钱赚的是美国股市,更重要的是阳谋,没有暗箱操作,一个金融公司做的AI产品,搅动着大洋彼岸无数专精AI的公司,然后还成功了。
爽文剧本。
最后,这个模型的训练成本撑死几万块钱,要是做空成功,那就是千百倍甚至更多的利润,简直是暴利。

回复 支持 反对

使用道具 举报

发表于 2025-1-28 20:05 | 显示全部楼层
外国网友:Deepseek 开发方怎么赚钱呢?就这么免费+开源暴力抢市场。
Deepseek 开发方:你猜我们公司主业是干啥的?给美股某些头部开空单、然后连续发模型不就行了。
回复 支持 反对

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册 微信登录 手机动态码快速登录

本版积分规则

关闭

官方推荐 上一条 /3 下一条

快速回复 返回列表 客服中心 搜索 官方QQ群 洽谈合作
快速回复返回顶部 返回列表