Author Archives: admin

【AIGC】ComfyUI常用概念备忘—-节点、数据、模型类型

一. 常见节点类型与作用

节点按照功能大致可以分为以下几类:

1. 加载模型节点

  • Checkpoints Loader:加载 .ckpt.safetensors 模型,输出模型检查点(Model Checkpoint)。

  • VAE Loader:加载对应的 VAE 文件。

  • CLIP Loader:加载用于文本编码的 CLIP 模型。

2. 文本提示节点

  • CLIP Text Encode:将用户输入的 Prompt 编码为语义向量(Text Condition),可作为生成条件。

  • CLIP Text Encode (Negative):负向提示词,用于去除不希望生成的元素。

3. 采样节点

  • KSampler:图像采样器,接收模型、提示、初始噪声等,生成最终图像。

  • KSampler (Advanced):带更多可控参数的采样版本。

4. 噪声和图像节点

  • Empty Latent Image:创建空白的潜空间图像张量(latent),用于起始输入。

  • Noise:生成随机噪声。

  • Latent to Image:将生成的 latent 图像解码为可见图像。

  • Image to Latent:将实际图像转换为 latent 表示。

5. 图像处理节点

  • Resize Image:改变图像分辨率。

  • Crop Image:裁剪图像。

  • Load Image / Save Image:读取/保存图像文件。

6. 控制模块

  • ControlNet Loader:加载 ControlNet 模型。

  • Apply ControlNet:在图像生成中应用 ControlNet 条件。

  • T2I Adapter:另一种控制模块,用于风格/姿态控制。

二. 节点之间的数据类型传递

不同节点之间的连接线,传递的是特定类型的数据:

数据类型 说明 常见来源 常见去向
Model Checkpoint 主模型结构及权重 Checkpoints Loader KSampler
CLIP Text Condition 文本提示的向量表示 CLIP Text Encode KSampler
Latent Image 潜空间图像(未解码) Empty Latent Image / KSampler Latent to Image
Image 普通 RGB 图像 Load Image / Latent to Image Resize / Save Image
Noise 随机噪声 Noise 节点 KSampler
VAE 解码器/编码器模型 VAE Loader Latent to Image 等
ControlNet Condition 条件图像等 Apply ControlNet KSampler
Prompt 文本字符串 用户输入 CLIP Text Encode

三. 常见模型格式

1. .safetensors(安全张量)

  • 开发者:由 Hugging Face 团队推出。

  • 优点

    • 安全:不使用 Python pickle,防止执行恶意代码。

    • 更快加载:支持零拷贝映射(mmap),加载速度更快。

    • 结构简单清晰:专门用于张量权重的存储。

  • 使用场景

    • 在 Hugging Face、ComfyUI、Diffusers 等生态中日益流行。

  • 适合谁:推荐在生产或部署时使用,因为它安全、加载快。


 2. .ckpt(Checkpoint)

  • 全称:checkpoint,常见于 TensorFlow、PyTorch。

  • 来源:Stable Diffusion 早期模型多使用此格式(如 v1-5-pruned.ckpt)。

  • 问题

    • 通常使用 Python 的 pickle 保存,存在代码执行风险

    • 体积通常大,因为可能包含训练中所有模块(如优化器、调度器等)。

  • 使用场景

    • 原始模型训练中保存断点,或早期模型发布格式。

  • 适合谁:用于开发调试或旧项目兼容。


 3. .pth(PyTorch权重)

  • 来源:PyTorch 官方推荐格式,用于保存 state_dict

  • 优点

    • 简洁,仅保存模型权重(不包含结构定义)。

  • 问题

    • 同样依赖 Python pickle存在安全隐患

    • 不跨平台,必须在 PyTorch 中读取。

  • 使用场景

    • 自己训练的模型中广泛使用。

  • 适合谁:熟悉 PyTorch 的用户、开发时保存模型权重。


4. .onnx(Open Neural Network Exchange)

  • 来源:微软、Facebook 主导开发的 跨平台格式

  • 优点

    • 跨框架:可在 PyTorch、TensorFlow、ONNX Runtime、NVIDIA TensorRT 等中使用。

    • 适合部署:结构与权重同时包含,适合导入推理引擎。

  • 使用场景

    • 导出模型用于 Web、移动、C++ 等非 Python 环境。

  • 适合谁:需要模型跨平台部署或优化推理性能的开发者。


5. .gguf(Grokking General Unified Format)

  • 来源ggml 系列项目(如 llama.cpp)推出的新格式,继承自 .ggml

  • 目标:用于 轻量化模型的本地推理,尤其适用于 CPU-only 运行、边缘设备。

  • 特点

    • 支持量化(如 Q4_0、Q5_K),文件体积小。

    • 与 LLaMA、Mistral、Gemma 等 LLM 配合使用。

  • 使用场景

    • 本地轻量推理(例如在 Mac、树莓派、安卓手机上运行大模型)。

  • 适合谁:希望在设备端低资源环境中运行 LLM 的用户。

四. 模型的量化与压缩

1. 什么是量化?

在原始训练后的模型中,权重通常是使用 32 位浮点数(float32) 存储的。

而“量化”就是将这些高精度浮点权重,转换为更低位数的整数表示,比如:

类型 原始精度 压缩后的精度 示例
FP32(float32) 32位浮点数 原始模型
Q8 8位整数 精度略下降 常见于轻量推理
Q4_0Q5_K 4位/5位整数 进一步压缩 gguf 格式中常见

2.为什么要量化?

目的 效果
减少文件体积 从几 GB 缩小到几百 MB,适合本地推理(尤其 CPU)
提升推理速度 整数计算比浮点计算快,适用于边缘设备
降低内存占用 低位宽张量占用更少 RAM,可在内存有限设备运行
⚠️ 略微精度损失 通常影响有限,尤其是在大模型中微不足道

3. Q4_0、Q5_K 是什么?

它们是不同的 量化等级/方法,你可以理解为压缩的“清晰度级别”:

量化等级 位宽 精度 文件体积 说明
Q8_0 8 位 精度几乎不变
Q5_K 5 位 性能和质量折中
Q4_0 4 位 极限压缩,精度略降

4. 浮点精度降低(压缩) vs 整数量化(量化)

项目 FP32 ➝ FP16/FP8 FP32 ➝ INT8 / Q4_0
类型 浮点 ➝ 浮点 浮点 ➝ 整数
是否严格算量化 ❌ 严格来说不是 ✅ 是标准量化
是否有指数位 ✅ 有(保留范围) ❌ 无(线性/分段)
计算精度 比较高,近似 FP32 精度低,依赖校准或训练
加速平台 GPU(如 NVIDIA Tensor Cores) CPU / GPU / 推理芯片

开门大吉

沉积近一年后重新开张~~

玩转微信公号开发(九)——获取用户信息

这里的“用户信息”,指的是昵称、头像等信息,具体的:

1
2
3
4
5
6
7
8
9
10
11
12
{
    "subscribe": 1, 
    "openid": "o6_bmjrPTlm6_2sgVt7hMZOPfL2M", 
    "nickname": "Band", 
    "sex": 1, 
    "language": "zh_CN", 
    "city": "广州", 
    "province": "广东", 
    "country": "中国", 
    "headimgurl": "http://wx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/0", 
   "subscribe_time": 1382694957
}

具体的接口是:
https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN

这里的ACCESS_TOKEN获取方法可以参考本系列之前的文章

如果用户没关注,subscribe字段为0,没有nickname、headimgurl等字段,只有用户关注你的公众号,才能拿到上面的全部信息

你可以用这个接口取得用户基本信息,也可以那它判断当前用户是否关注你的公众号

早期的时候,微信对用户基本信息控制的比较严格,只有用户授权过才能拿到这些信息,而且,再次拿信息的话,还要重新授权

偶然才看到微信的文档有了升级,用户信息接口换成了这个新的:/user/info,免去了惹人厌的授权过程。这点小小的开放,让很多基于微信的活动方案成为可能【赞一个】

————–
转载请注明出处:http://www.jiangkl.com/2014/04/weixin_user_info

微信公众平台的新功能

在犹抱琵琶半遮面了N久以后,小伙伴们期待已久的新版微信公众平台后台终于上线了,这次上线的,不仅有页面的改版,更带来很多实用的新功能

比如统计功能,可以统计用户、消息的各种数据
再比如商户功能里支付测试支持,以及对浏览次数和成交量的统计

当然啦,对于开发者来说,最吸引我们的还是伴随而来的新开发的各种接口以及姗姗来迟的调试功能

“微信公众平台接口调试工具”是一个很好用的功能,可以让我们在不使用服务器的情况下就可以调用各种接口,估计以后会很常用

下面,我们来盘点一下微信公众平台对普通公众号开发的接口们

  • 1. 基础接口
    1. a. 服务器配置的验证
      这里,是你在设置服务器url时,微信会验证这个服务器的正确性,具体的,包括代码回复格式的正确性,以及对应的微信号是否正确
      b. access_token的获取
      “access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token”,有效期两个小时
      特别注意,是“唯一”,比如对于同一个工作号,一个项目里先申请了一个access_token,另一个项目里又申请了一个,则在第一个项目里的access_token就已经失效了(即便没有超过两个小时的时限)
  • 2. 消息相关
    1. a. 接受消息
      在微信开发平台后台配置了“服务器配置”的url后,再有用户给公众号发送信息,就需要你的服务器来回复信息了
      接受消息包括文本、图片、语音、视频、地理位置,以及链接
      在这里,服务器收到的数据是xml,我们回复的,也需要是xml
      b. 语音识别结果
      “开通语音识别功能”,可以将语音信息对应的文本信息一起发送给服务器,可以那它语言搜索内的功能,如果再和上面的“上报地理位置”结合,就更有想象空间了~~
      c. 主动向用户发送消息
      之前,要主动向特定用户发送消息,只能使用微信的模板消息,使用起来相当复杂
      有了这个主动消息接口,问题就简单多了,“当用户主动发消息给公众号的时候”,开发则既可以在24小时内,给该用户发送消息,包括文本、图片、音视频、图文
      从这里开始,消息的数据格式变成了json
      d. 上传下载多媒体文件
      如果你要给用户回复、发送语音、图片、视频等内容,这个接口是非常必要的
      接口返回media_id,在3天之内,便可以随便使用这个media_id来使用你的多媒体信息
  • 3. 自定义菜单相关
    1. a. 自定义菜单的增删改查
      微信终于全面开发了自定义菜单的功能,有了自定义菜单,才有可能以微信为平台构建我们的“轻App”
      b. 自定义菜单事件
      微信的自定义菜单,可以是一个链接,也可以是发送给服务器的一个事件消息,然后服务器回复对应的消息,回复的格式同上面第2部的“接受消息”
  • 4. js api
    1. 当用户在微信内置浏览器访问我们的页面时,我们可以通过jsapi做下面的事情
      a. 获取用户网络状态,包括wifi、2G、3G
      b. 隐藏右上角分享按钮、隐藏网页底部导航栏,让你的页面更像原生应用
  • 5. 地理位置相关
    1. a. 上报地理位置
      “开通了上报地理位置接口的公众号,用户在关注后进入公众号会话时,会弹框让用户确认是否允许公众号使用其地理位置”,弹框只在关注后出现一次
      “进入时上报地理位置”,”每5秒上报一次地理位置”,这又是一个看起来很牛x的功能,我们可以围绕它做出类似导航、购物搜索的功能
  • 6. 用户信息
    1. a. 分组管理
      通过服务器增删改查分组信息,比如,可以将关注用户划分成主动向公众好发送过信息、发送过地理位置信息、回复过xx信息等等

      b. 获取用户基本消息
      “关注者与公众号产生消息交互后”,公众号既可以获得该用户的基本信息,包括昵称、头像、城市、性别等

      c. OAuth2.0
      当用户在微信内置浏览器访问我们的页面时(不需要必须关注公众号),我们就可以获得访问者的openId,以及用户的其他基本信息
      如果你执行获得访问者openId,通过几次redirect,和普通的OAuth过程是一样的
      如果要获得用户基本信息,微信就会弹出授权界面,并且每次重新再试图获取用户信息是,微信都会弹出授权界面

      d. 获取关注者列表
      终于有了同步所有关注用户列表的接口了!

      e. 扫描带参数二维码
      这是一个相当强大的功能,可以让用户扫码后自动关注你的公众号(需要用户点一下“确定”),同时你还可以给用户回复一条欢迎信息

上面只说了微信开发接口的功能,具体的接口地址、参数什么的,同志们可以自己到公众平台的开发者文档里去查询

———
参考:微信公众平台开发者文档

seajs入门

seajs是一个功能强大、使用简单的js包管理器,有了它,就可以方便快捷的实现js的模块化编程
下面简单介绍seajs的使用方法
比如有index.html,加入如下代码即可引入seajs及相关的配置:

<script src="assets/js/sea.js"></script>
<script>
  seajs.config({
    alias: {
      // 指定使用的 jQuery 版本 注意:这里的jauery是经过seajs包装的
      'jquery': 'jquery-1.8.0' 
    }
  })
  // 加载入口模块,main.js
  seajs.use('./assets/js/main')
</script>

在main.js内:

  define(function(require){
    var SS = require('./ss');
    var s = new SS();
    s.fun1(); //"fun1"
  });

上面通过require引入了一个叫做ss的模块,如下:ss.js

define(function(require, exports, module){
  //引入jquery模块
  var $ = require('jquery');
  //对外输入SS类
  module.exports = function(){
    function SS(){
 
    }
    SS.prototype = {
      fun1 : function(){
        alert('fun1');
      }
    };
    return SS;
  }();
});

关于seajs的简单使用,上面就讲完了,最后在说一个小细节:通过require(‘xxx’)引入的对象是“单例”的,比如下面s2.js

define(function(require, exports, module){
  module.exports = function(){
    function SS(){
      this.s = 1;
    }
    SS.prototype = {
      fun1 : function(){
        alert(this.s);
      }
    };
    //返回实例化后的SS
    return new SS();
  }();
});

再这样调用s2

  var t1 = require('./s2');
  t1.s = 3;
  var t2 = require('./s2');
  t2.fun1(); //这是,会alert 3

看到了吧,s2本来有一个属性s=1,再第一次引用t1内,被设置为3,再次通过require引用s2到t2,此时t2的s属性也变成了3,也就是说在seajs内有一个“require”的对象库,每一个通过module.exports输出的对象都会被保存在里面,再次require时,返回到仍然是原对象
————-
关于seajs更多内容,请参考:https://github.com/seajs/seajs/issues/266