一、图片反推利器JoyCaption2介绍
JoyCaption2是一款很优秀的图片反推模型,可以根据图生文(或图片打标),支持多模态语义理解、智能标签优化、并支持与ComfyUI集成。下面介绍Mac环境下插件的安装和使用:
二、软件版本信息
- 操作系统:MacOS Sequoia 15.3.2
- Python版本: 3.12.8
- ComfyUI版本: ComfyUI v0.3.26, ComfyUI_frontend v1.11.8
- 关键ComfyUI插件:
三、安装步骤:
可参考官方文档 进行手工安装,下面内容针对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
五、常见问题解决:
- 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 版本。
- 报错huggingface_hub版本太低:因其他工具依赖更高版本,可通过修改 requirements 文件,将 huggingface_hub 改为 “>=” 形式。
参考资料:
文章未经特殊标明皆为本人原创,未经许可不得用于任何商业用途,转载请保持完整性并注明来源链接 《ITechLib》
- Posted on March 22, 2025
- Categorized AI
- Tagged ComfyUI
之前我的博客托管在外网的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,后续有时间再对博客做全面升级,以支持最新的操作系统。具体步骤如下:
- 本地安装Ubuntu镜像:
- 开发环境:采用 arm 架构安装 Ubuntu 16.04 镜像,用于博客工程的开发测试和更新,目前使用过程中未发现问题。
- 准生产环境:为了与生产服务器架构保持一致,采用amd64架构安装Ubuntu镜像。
- 模拟生产宿主环境:本地安装Ubuntu24.04镜像,用于模拟生产环境的宿主服务器。
- 初始化镜像环境:安装必要的包、创建用户、配置ssh服务器。
- 安装应用程序:在镜像中安装Rails、solr等应用程序,可以使用之前做的ansible工具直接安装。
- 保存镜像:将安装好的容器保存为镜像,使用commit命令。
- 镜像可以认为是稳定的、可复用、持久化的系统。
- 容器可以认为是可以丢弃的、不稳定的存在,可以很方便用来试错。
- commit前尽量删除无用的文件、安装程序等,减小镜像的体积。
- 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 软件。
- 数据库配置:出于性能考虑,使用宿主机的MySQL服务器。避免在Docker容器中直接运行MySQL。
- 为了安全,通过设置ufw防火墙,仅允许容器固定IP远程访问MySQL。
- 防火墙配置:配置docker-ufw,防止外网访问docker暴露的端口。安装完正常无需特殊配置。
- 镜像迁移:将生产镜像导出,上传到生产环境,再导入到生产服务器。
至此,博客主体部署已完成,下面简单列举一下生产服务器的其他配置内容,供大家参考:
- SSH登录配置:
- 禁止以root身份登录
- 取消使用密码登录,改用SSH证书登录
- 设置虚拟内存,参考:Ubuntu实例中添加swap分区的方法
- 设置ufw防火墙:
- 安装Fail2ban软件
- Web 服务器配置:配置nginx,安装https证书。
参考教程
- Ubuntu使用certbot配置nginx服务器的ssl证书
- Deploying a Ruby app on a Linux/Unix production server
- Installing Older Ruby Versions on Ubuntu 24.04 and 22.04
- How to install MySQL 5.7 on ubuntu 20.04 or later
- Ubuntu实例中添加swap分区的方法
- UFW-Docker 使用教程
文章未经特殊标明皆为本人原创,未经许可不得用于任何商业用途,转载请保持完整性并注明来源链接 《ITechLib》
- Posted on February 20, 2025
- Categorized linux
- Tagged linux
网络代理是一种存在与网络的中间人,代理是存在与客户端和服务器之间的角色,从用途上看可以分为正向代理和反向代理。一直以来对这两个名词理解不是特别深刻,经过前段时间的项目,对这两种代理有了更深的认识,用一句话来归纳两者的区别就是“两者服务的对象不同”。
正向代理是代理客户端的,是为客户端服务的,可以想到的用途有局域网内访问外网、翻墙、局域网加速、网络访问控制、隐私保护等等。正向代理试图以客户的身份来访问服务端,正向代理更倾向于解决客户或是客户的管理者的问题,例如公司对员工上网的限制,公司节省流量的考虑,个人要访问国外资源的需要等等。典型的正向代理软件有:Squid、Tinyproxy等等。最常用的就属Squid了,Squid的一些相关好的资料请参考本文最后的参考资料。值得一提的是Squid是可以代理http和https协议的,其中代理https协议并不存在大家认为的安全性问题(https协议本身就是防中间人攻击的),具体代理原理可以参考HTTP 代理原理及实现(一)。
反向代理则是代理服务端的,是为服务端服务的,可以想到的用途有负载均衡、SSL加密、缓存静态资源、压缩等。常见的反向代理软件有Nginx、Haproxy、Apache等等,如果只谈负载均衡还有一些工作在网络层的软件如LVS或是硬件F5等。反向代理服务器可以对客户端发来的请求进行负载均衡转发(支持多种负载均衡策略),更改请求的HOST头,对客户请求进行过滤(如设置黑名单等)等。我们项目中使用的Nginx,主要用来进行负载均衡、请求转发。
近期我自己也写了个简单的反向代理,它可以对于特定的URL请求进行过滤,并对服务器返回的内容进行修改,替换成你需要的内容。这个在我们的测试中解决了外网访问的问题,因为外网使用的域名和内网测试不同,为了屏蔽差异,我通过这个反向代理对个别URL的内容进行了修改,修改成外网可使用的内容。具体代码见hrcproxy.go,代码采用go语言编写,目前实现了简单的字符串替换,后续考虑再增加表达式相关的替换。
参考资料:
- 正向代理与反向代理的区别
- Squid中文权威指南
- 区网控制者: Proxy 服务器 - Squid
- 构建Squid代理服务器
- HTTP 代理原理及实现(一)
- Nginx通过二级目录(路径)映射不同的反向代理,规避IP+端口访问
- Reverse Proxy In Go
- How DNS lookups work when using an HTTP proxy (or not) in IE
- 三种解密 HTTPS 流量的方法介绍
- ZeroSSL,支持多域名的在线 Let’s Encrypt SSL 证书申请工具
文章未经特殊标明皆为本人原创,未经许可不得用于任何商业用途,转载请保持完整性并注明来源链接 《ITechLib》
项目开发分为生产环境和测试环境,有很多时候测试环境也需要和外部系统互通,目前主要是采用互联网的形式。我们的测试环境更特殊一些,他不仅仅是在内网,而且是在内部私有云上,外部只能通过VPN访问。而且这个VPN有很多限制,例如:
- 只能使用cisco anyconnect客户端,这个客户端只能安装在windows机器上,不支持Linux;
- 只要启动了VPN客户端,这个windows机器就只能访问云上的测试环境,不能访问互联网了;
- VPN登录需要用户名和密码,如果其他单位客户要使用,我们需要给他们提供用户名密码,有安全问题;
- VPN安装过程复杂,需要安装证书等,有些机器无法安装成功。
我们开发的应用是要对外发布互联网接口的,客户需要调我们的接口来完成他们需要的功能。在生产环境下没什么问题,因为生产环境有自己的域名也支持互联网访问。但在测试环境就有问题了,客户如何调用我们在云上的服务就是一个难题。在经过引导客户装VPN遇到各种问题,被客户各种吐槽后,我们开始想解决之道。一个方案是打通一条不使用VPN的路,可以让互联网直接访问,这需要协调多个部门,开通各种网络访问关系,很复杂。另一个方案就是现在要讲的方案,通过虚拟机支持多网卡的特点,我们可以实现在一台物理机同时访问互联网和vpn,结合NAT穿越可以实现通过互联网直接访问内网服务器。大体的网络配置图如下:

这里有几个要点:
- 虚拟机要有两个网卡,其中网卡1可以访问互联网(可以是桥接或NAT模式),这个网卡是用来给VPN客户端使用的;另一个网卡2要配置成host only,实现和物理主机的双向访问;
- 在虚拟机中要安装nginx,监听80端口,并将请求转发到内网服务器的nginx服务器上,转发http请求;
- 在物理机中安装nginx,监听80或443端口,将收到的http/https请求转发到虚拟机的nginx服务器的80端口;
- 在物理机中安装frpc客户端,联通与互联网服务器的frps服务器的交互,并将请求转发给本机nginx服务器;
- 在互联网上的服务器中安装frps服务器,将收到的请求转发给frpc客户端;
- 购买一个公网的域名,指向这个互联网服务器,一个域名很便宜,一年8元就可以了。
物理机的nginx和frpc配置见这里,大家可以参考使用。
参考资料
- 使用内网穿透工具frp
- ZeroSSL,支持多域名的在线 Let’s Encrypt SSL 证书申请工具
- frp github
- Nginx通过二级目录(路径)映射不同的反向代理,规避IP+端口访问
文章未经特殊标明皆为本人原创,未经许可不得用于任何商业用途,转载请保持完整性并注明来源链接 《ITechLib》
好久不更新了,今年以来项目组的事特别多。主要是项目数量有了指数级增长,原来做的项目主要是以银行自己的需求为主,最近做的项目很多都是社会项目。这里说的社会项目是指为社会上的其他客户提供服务的项目。这种情况在很大程度是因为今年各行各业对信息化的诉求,信息化已成为一大趋势,你如果听新闻的话会发现现在新闻上70%的 内容都和技术有关,现在连业务人员也开始提大数据、人工智能、区块链等。
在我眼中社会项目分为两类,一类是为某一行业客户提供完整解决方案的,比如智慧医疗系统,为医院提供挂号,就诊,看病等全面解决方案(当然这其中肯定也包括金融)。不得不说我们很多项目都属于这种类型,我觉得一方面是银行面对的客户分布在各行各业,而这些行业信息化都有待提高(特别是传统行业),另一方面是大家觉得做这种系统可以更好地服务这个行业客户,让他们成为银行的忠实客户。另一类项目是为不同行业的客户提供金融解决方案,站在客户角度来思考金融系统应该实现的功能,提升客户的金融体验,让客户更好的管好自己的钱,进而更好地做自己的业务。这类项目相对于原来银行的作为自己用的金融产品,变为做给客户用的金融产品。这类项目与第一类项目的不同是它会较少涉及客户的业务流程,而是作为一个功能嵌入到客户已有的系统中,使它做能更多的金融相关的事情。
这两种类型的项目谈不上绝对的优劣,主要和公司的发展战略有关,也和后期的执行力有关。我最近负责的主要是第二类项目,在我看来这种项目更加务实一些,也更易于和大客户搞好关系(因为大客户很多都有自己的系统,自主研发、外包或购买),如果能抓住客户的痛点,可以形成针对一类客户的解决方案。第二类项目相对银行在实施上也更加容易,业务人员也更易于把握产品设计方向,简言之就是性价比比较高。
最近接触了一些分行业务和客户,体会到银行和其他行业有很大区别,各行各业都是银行的客户,银行的客户关系是最广泛的,也是最深刻的。这就导致我前面说的项目众多的现象,银行可以为各行各业做系统,做服务。目前各家企业的财务信息化程度都不是很高,这主要体现在财务和他们实际业务的割裂,这就导致他们在很多方面无法很好的实现精细化管理,其中涉及到很多人工的成分。这些都是银行的机会,我们可以帮助客户实现他们业务和财务的衔接,从而提高客户的管理能力,减轻客户财务人员的压力,提高客户的决策能力。在此基础上银行可以提供更加丰富的融资、投资等金融服务。
做自己擅长的事,利用自身的优势(包括技术优势,业务优势,资源优势),把自己擅长的事做精。我相信这是一条很好的道路,不管是近期还是远期。最近的另一个收获就是解决问题的思路拓宽了,不仅仅只有自己做,还可以和别人合作来做,甚至可以买别人的产品来做。在做产品设计的时候要保证方案的适应性,尽量做到隔离,从而增加产品的灵活性,为后面拓展业务做准备。
后面我可能会多写一些业务或是管理方面的文章,倒不是不注重技术,技术一直是我的根本,多了解业务是为了拓展自己的思路,能让自己未来走的更远。
文章未经特殊标明皆为本人原创,未经许可不得用于任何商业用途,转载请保持完整性并注明来源链接 《ITechLib》
- Posted on July 25, 2018
- Categorized work
- Tagged 银行, 业务