Mac环境ComfyUI部署JoyCaption2实现图片反推

一、图片反推利器JoyCaption2介绍

JoyCaption2是一款很优秀的图片反推模型,可以根据图生文(或图片打标),支持多模态语义理解、智能标签优化、并支持与ComfyUI集成。下面介绍Mac环境下插件的安装和使用:

二、软件版本信息

三、安装步骤:

可参考官方文档 进行手工安装,下面内容针对Mac环境进行了适当调整:

1. 插件安装

把仓库下载克隆到 custom_nodes 子文件夹下:

cd custom_nodes
git clone https://github.com/EvilBT/ComfyUI_SLK_joy_caption_two.git

修改requirements.txt,根据mac后面遇到的问题进行修改: 将huggingface_hub改为>=,将bitsandbytes版本改为>=0.42.0,因为mac没有0.44.1的版本,具体如下:

huggingface_hub>=0.23.4
transformers>=4.44.0
numpy==1.26.4
sentencepiece==0.2.0
pillow>=10.4.0
bitsandbytes>=0.42.0
peft>=0.12.0

安装依赖

pip install -r ComfyUI_SLK_joy_caption_two\requirements.txt

2. 模型下载

  • google/siglip-so400m-patch14-384:视觉编码器,使用huggingface-cli来整体下载,并把siglip-so400m-patch14-384内的全部文件复制到models/clip/siglip-so400m-patch14-384
  • unsloth/Meta-Llama-3.1-8B-Instruct语言大模型,务必下载此 8B 版本,bnb-4bit 版本因 bitsandbytes 版本问题在 Mac 上不被支持。下载完成后,将整个文件夹内容复制到models\LLM\Meta-Llama-3.1-8B-Instruct路径下。
  • Joy-Caption-alpha-two核心推理模型(版本2024-09-26a),必须手动下载:鉴于该工程在 huggingface 上属于 space,下载指令如下huggingface-cli download --token 替换为你的token spaces/fancyfeast/joy-caption-alpha-two --local-dir joy-caption-alpha-two;然后将 Joy-Caption-alpha-two 下的cgrkzexw-599808 文件夹的所有内容下载复制到models/Joy_caption_two 下。

3.重启ComfyUI生效

四、示例工作流

工作流支持图生文,批量处理,个性化扩展配置。

下载地址如下:JoyCaption2-comfyUI-example.json

五、常见问题解决:

  1. ImportError: Using bitsandbytes 4-bit quantization requires the latest version of bitsandbytes: pip install -U bitsandbytes:此问题是由于 Mac 系统中的 bitsandbytes 版本过低,且当前无更高版本可供使用。解决方案为采用unsloth/Meta-Llama-3.1-8B-Instruct的 8B 版本,避免使用 bnb-4bit 版本。
  2. 报错huggingface_hub版本太低:因其他工具依赖更高版本,可通过修改 requirements 文件,将 huggingface_hub 改为 “>=” 形式。

参考资料:

文章未经特殊标明皆为本人原创,未经许可不得用于任何商业用途,转载请保持完整性并注明来源链接 《ITechLib》

博客迁移历程

之前我的博客托管在外网的Linode上,Linode整体还是挺好的,支持一键迁移,服务器也很稳定,网站上教程资源很丰富;缺点就是国内访问的网速总是不理想,延迟很大,其间我尝试了 Linode 不同地区的机房,问题都没有解决,网速不稳定,经常会很慢。

近期,我下定决心迁移博客,彻底解决这个问题,后续也准备将博客继续维护起来;经过广泛调研,并综合考量性价比等多方面因素,决定将博客迁移到阿里云。接下来,我将详细分享博客迁移的全过程,其中我也踩了不少坑,希望能给大家提供一些参考。

博客运行环境

博客的运行环境主要涉及以下技术栈:

  • 操作系统:Ubuntu 16.04
  • 编程语言及框架:Ruby 2.3.8、Rails 4.2.4
  • 数据库:MySQL 5.7
  • 搜索服务:Solr 5.5.4
  • Web 服务器及应用服务器:Nginx + Passenger

此外,Rails依赖的需要本地编译的包如下:

  • nokogiri 1.6.6.2
  • mysql2 0.3.20

部署工具方面

  • ansible 2.0.0.2
  • bundler 1.17.2
  • capistrano 3.6.1

迁移目标及方案

如果是将上述系统直接部署到Ubuntu16.04上会很简单,因为我前期已经整理了功能完善的ansible部署工具,可以实现一键部署,完成所有的依赖安装和环境配置。但考虑到Ubuntu16.04已停止维护,为了让这次迁移更加彻底,我决定将操作系统升级到最新的Ubuntu24.04。

不得不说,我前期严重低估了迁移的难度,从过年到现在,竟然花了将近两周时间(原本预计只需两天)。

方案一、 折腾本地虚拟机,重新启用ansible部署工具(失败)

  • 安装Mac版Ubuntu  24.04 虚拟机:需要装arm版的【解决】。难点:arm版本导致很多依赖包无法使用或默认缺失,需要单独下载和编译。
  • 使用最新版ansible软件(2.18.2):仅因为不想安装太久的版本【艰难解决】。难点:和老版本不兼容,部分需要修改代码解决。
  • ~~原计划安装最新版的Ruby 4.1 ,之后因为很多依赖包不兼容,放弃。~~
  • 安装Ruby-2.3.8版本【解决】。难点:缺少libssl1.0-dev,需要源码编译安装,然后才能编译安装Ruby,建议使用rvm来安装。
  • 安装bundler包:使用1.17.2版本。
  • 安装依赖gem包 - nokogiri【艰难成功】。nokogiri编译安装依赖部分本地包,需要通过源码编译安装iconv、 libxml2-2.9.2、libxslt-1.1.28等。
  • 安装依赖gem包 - mysql2:其编译依赖mysql5.7的dev包
  • 安装Mysql 8.0 ,与mysql2 0.3.20包冲突,但这个是底层包无法更新。【冲突】
  • 安装mysql 5.7 成功,但安装依赖的dev包,和其他dev包冲突。【冲突】

在解决了无数问题后,发现这条路走下去,即使编译通过并安装成功,运行过程中也难免出现各种问题,于是决定放弃方案一。

方案二、使用docker镜像安装

为了避免上面遇到的各种编译及依赖问题,我决定将博客主体继续运行在Ubuntu16.04上,但又不想放弃升级到Ubuntu24.04的想法。经过综合考虑,决定采用Docker来部署,这样外部的主机使用Ubuntu24.04,后续有时间再对博客做全面升级,以支持最新的操作系统。具体步骤如下:

  1. 本地安装Ubuntu镜像
    • 开发环境:采用 arm 架构安装 Ubuntu 16.04 镜像,用于博客工程的开发测试和更新,目前使用过程中未发现问题。
    • 准生产环境:为了与生产服务器架构保持一致,采用amd64架构安装Ubuntu镜像。
    • 模拟生产宿主环境:本地安装Ubuntu24.04镜像,用于模拟生产环境的宿主服务器。
  2. 初始化镜像环境:安装必要的包、创建用户、配置ssh服务器。
  3. 安装应用程序:在镜像中安装Rails、solr等应用程序,可以使用之前做的ansible工具直接安装。
  4. 保存镜像:将安装好的容器保存为镜像,使用commit命令。
    • 镜像可以认为是稳定的、可复用、持久化的系统。
    • 容器可以认为是可以丢弃的、不稳定的存在,可以很方便用来试错。
    • commit前尽量删除无用的文件、安装程序等,减小镜像的体积。
  5. Docker向宿主机器暴露端口,进行端口映射:
    • 开发环境:为方便开发,开放了多个端口(前面为宿主机端口、后面为镜像中开放的端口):
      • 10022:22 :SSH服务,便于上传和编辑文件。可通过SSH支持VSCode远程开发代码,但无法使用 AI 是个小缺点,后续可考虑通过 SSH 同步工具实现代码同步。
      • 10080:80 :HTTP服务
      • 13000:3000:Rails server端口,便于在宿主机进行调试
      • 13306:3306:MySQL数据库端口,便于通过Mac的图形化界面进行管理
      • 18983:8983:Solr搜索端口,便于在宿主机调试
      • 8086:8086 和 8087:8087 :作为备用端口,避免每次开放新端口都需要 commit 镜像的麻烦。
    • 生产环境:出于安全性考虑,仅开放最少的端口:
      • 33000:3000:Passenger服务器的默认端口
      • 30022:22 :SSH服务器的端口,为保障安全,关闭了密码登录,仅允许证书登录,并安装了 Fail2ban 软件。
  6. 数据库配置:出于性能考虑,使用宿主机的MySQL服务器。避免在Docker容器中直接运行MySQL。
    • 为了安全,通过设置ufw防火墙,仅允许容器固定IP远程访问MySQL。
  7. 防火墙配置:配置docker-ufw,防止外网访问docker暴露的端口。安装完正常无需特殊配置。
  8. 镜像迁移:将生产镜像导出,上传到生产环境,再导入到生产服务器。

至此,博客主体部署已完成,下面简单列举一下生产服务器的其他配置内容,供大家参考:

  1. SSH登录配置
    • 禁止以root身份登录
    • 取消使用密码登录,改用SSH证书登录
  2. 设置虚拟内存,参考:Ubuntu实例中添加swap分区的方法
  3. 设置ufw防火墙
  4. 安装Fail2ban软件
  5. Web 服务器配置:配置nginx,安装https证书。

参考教程

  1. Ubuntu使用certbot配置nginx服务器的ssl证书
  2. Deploying a Ruby app on a Linux/Unix production server
  3. Installing Older Ruby Versions on Ubuntu 24.04 and 22.04
  4. How to install MySQL 5.7 on ubuntu 20.04 or later
  5. Ubuntu实例中添加swap分区的方法
  6. UFW-Docker 使用教程

文章未经特殊标明皆为本人原创,未经许可不得用于任何商业用途,转载请保持完整性并注明来源链接 《ITechLib》

网络正向代理与反向代理

网络代理是一种存在与网络的中间人,代理是存在与客户端和服务器之间的角色,从用途上看可以分为正向代理和反向代理。一直以来对这两个名词理解不是特别深刻,经过前段时间的项目,对这两种代理有了更深的认识,用一句话来归纳两者的区别就是“两者服务的对象不同”。

正向代理是代理客户端的,是为客户端服务的,可以想到的用途有局域网内访问外网、翻墙、局域网加速、网络访问控制、隐私保护等等。正向代理试图以客户的身份来访问服务端,正向代理更倾向于解决客户或是客户的管理者的问题,例如公司对员工上网的限制,公司节省流量的考虑,个人要访问国外资源的需要等等。典型的正向代理软件有:Squid、Tinyproxy等等。最常用的就属Squid了,Squid的一些相关好的资料请参考本文最后的参考资料。值得一提的是Squid是可以代理http和https协议的,其中代理https协议并不存在大家认为的安全性问题(https协议本身就是防中间人攻击的),具体代理原理可以参考HTTP 代理原理及实现(一)

反向代理则是代理服务端的,是为服务端服务的,可以想到的用途有负载均衡、SSL加密、缓存静态资源、压缩等。常见的反向代理软件有Nginx、Haproxy、Apache等等,如果只谈负载均衡还有一些工作在网络层的软件如LVS或是硬件F5等。反向代理服务器可以对客户端发来的请求进行负载均衡转发(支持多种负载均衡策略),更改请求的HOST头,对客户请求进行过滤(如设置黑名单等)等。我们项目中使用的Nginx,主要用来进行负载均衡、请求转发。

近期我自己也写了个简单的反向代理,它可以对于特定的URL请求进行过滤,并对服务器返回的内容进行修改,替换成你需要的内容。这个在我们的测试中解决了外网访问的问题,因为外网使用的域名和内网测试不同,为了屏蔽差异,我通过这个反向代理对个别URL的内容进行了修改,修改成外网可使用的内容。具体代码见hrcproxy.go,代码采用go语言编写,目前实现了简单的字符串替换,后续考虑再增加表达式相关的替换。

参考资料:

  1. 正向代理与反向代理的区别
  2. Squid中文权威指南
  3. 区网控制者: Proxy 服务器 - Squid
  4. 构建Squid代理服务器
  5. HTTP 代理原理及实现(一)
  6. Nginx通过二级目录(路径)映射不同的反向代理,规避IP+端口访问
  7. Reverse Proxy In Go
  8. How DNS lookups work when using an HTTP proxy (or not) in IE
  9. 三种解密 HTTPS 流量的方法介绍
  10. ZeroSSL,支持多域名的在线 Let’s Encrypt SSL 证书申请工具

文章未经特殊标明皆为本人原创,未经许可不得用于任何商业用途,转载请保持完整性并注明来源链接 《ITechLib》

搭建通往私有内网web服务器的路

项目开发分为生产环境和测试环境,有很多时候测试环境也需要和外部系统互通,目前主要是采用互联网的形式。我们的测试环境更特殊一些,他不仅仅是在内网,而且是在内部私有云上,外部只能通过VPN访问。而且这个VPN有很多限制,例如:

  • 只能使用cisco anyconnect客户端,这个客户端只能安装在windows机器上,不支持Linux;
  • 只要启动了VPN客户端,这个windows机器就只能访问云上的测试环境,不能访问互联网了;
  • VPN登录需要用户名和密码,如果其他单位客户要使用,我们需要给他们提供用户名密码,有安全问题;
  • VPN安装过程复杂,需要安装证书等,有些机器无法安装成功。

我们开发的应用是要对外发布互联网接口的,客户需要调我们的接口来完成他们需要的功能。在生产环境下没什么问题,因为生产环境有自己的域名也支持互联网访问。但在测试环境就有问题了,客户如何调用我们在云上的服务就是一个难题。在经过引导客户装VPN遇到各种问题,被客户各种吐槽后,我们开始想解决之道。一个方案是打通一条不使用VPN的路,可以让互联网直接访问,这需要协调多个部门,开通各种网络访问关系,很复杂。另一个方案就是现在要讲的方案,通过虚拟机支持多网卡的特点,我们可以实现在一台物理机同时访问互联网和vpn,结合NAT穿越可以实现通过互联网直接访问内网服务器。大体的网络配置图如下:

网络配置示意图

这里有几个要点:

  1. 虚拟机要有两个网卡,其中网卡1可以访问互联网(可以是桥接或NAT模式),这个网卡是用来给VPN客户端使用的;另一个网卡2要配置成host only,实现和物理主机的双向访问;
  2. 在虚拟机中要安装nginx,监听80端口,并将请求转发到内网服务器的nginx服务器上,转发http请求;
  3. 在物理机中安装nginx,监听80或443端口,将收到的http/https请求转发到虚拟机的nginx服务器的80端口;
  4. 在物理机中安装frpc客户端,联通与互联网服务器的frps服务器的交互,并将请求转发给本机nginx服务器;
  5. 在互联网上的服务器中安装frps服务器,将收到的请求转发给frpc客户端;
  6. 购买一个公网的域名,指向这个互联网服务器,一个域名很便宜,一年8元就可以了。

物理机的nginx和frpc配置见这里,大家可以参考使用。

参考资料

  1. 使用内网穿透工具frp
  2. ZeroSSL,支持多域名的在线 Let’s Encrypt SSL 证书申请工具
  3. frp github
  4. Nginx通过二级目录(路径)映射不同的反向代理,规避IP+端口访问

文章未经特殊标明皆为本人原创,未经许可不得用于任何商业用途,转载请保持完整性并注明来源链接 《ITechLib》

做自己擅长的事

好久不更新了,今年以来项目组的事特别多。主要是项目数量有了指数级增长,原来做的项目主要是以银行自己的需求为主,最近做的项目很多都是社会项目。这里说的社会项目是指为社会上的其他客户提供服务的项目。这种情况在很大程度是因为今年各行各业对信息化的诉求,信息化已成为一大趋势,你如果听新闻的话会发现现在新闻上70%的 内容都和技术有关,现在连业务人员也开始提大数据、人工智能、区块链等。

在我眼中社会项目分为两类,一类是为某一行业客户提供完整解决方案的,比如智慧医疗系统,为医院提供挂号,就诊,看病等全面解决方案(当然这其中肯定也包括金融)。不得不说我们很多项目都属于这种类型,我觉得一方面是银行面对的客户分布在各行各业,而这些行业信息化都有待提高(特别是传统行业),另一方面是大家觉得做这种系统可以更好地服务这个行业客户,让他们成为银行的忠实客户。另一类项目是为不同行业的客户提供金融解决方案,站在客户角度来思考金融系统应该实现的功能,提升客户的金融体验,让客户更好的管好自己的钱,进而更好地做自己的业务。这类项目相对于原来银行的作为自己用的金融产品,变为做给客户用的金融产品。这类项目与第一类项目的不同是它会较少涉及客户的业务流程,而是作为一个功能嵌入到客户已有的系统中,使它做能更多的金融相关的事情。

这两种类型的项目谈不上绝对的优劣,主要和公司的发展战略有关,也和后期的执行力有关。我最近负责的主要是第二类项目,在我看来这种项目更加务实一些,也更易于和大客户搞好关系(因为大客户很多都有自己的系统,自主研发、外包或购买),如果能抓住客户的痛点,可以形成针对一类客户的解决方案。第二类项目相对银行在实施上也更加容易,业务人员也更易于把握产品设计方向,简言之就是性价比比较高。

最近接触了一些分行业务和客户,体会到银行和其他行业有很大区别,各行各业都是银行的客户,银行的客户关系是最广泛的,也是最深刻的。这就导致我前面说的项目众多的现象,银行可以为各行各业做系统,做服务。目前各家企业的财务信息化程度都不是很高,这主要体现在财务和他们实际业务的割裂,这就导致他们在很多方面无法很好的实现精细化管理,其中涉及到很多人工的成分。这些都是银行的机会,我们可以帮助客户实现他们业务和财务的衔接,从而提高客户的管理能力,减轻客户财务人员的压力,提高客户的决策能力。在此基础上银行可以提供更加丰富的融资、投资等金融服务。

做自己擅长的事,利用自身的优势(包括技术优势,业务优势,资源优势),把自己擅长的事做精。我相信这是一条很好的道路,不管是近期还是远期。最近的另一个收获就是解决问题的思路拓宽了,不仅仅只有自己做,还可以和别人合作来做,甚至可以买别人的产品来做。在做产品设计的时候要保证方案的适应性,尽量做到隔离,从而增加产品的灵活性,为后面拓展业务做准备。

后面我可能会多写一些业务或是管理方面的文章,倒不是不注重技术,技术一直是我的根本,多了解业务是为了拓展自己的思路,能让自己未来走的更远。

文章未经特殊标明皆为本人原创,未经许可不得用于任何商业用途,转载请保持完整性并注明来源链接 《ITechLib》