肇鑫的日常博客

肇鑫 / Owen Zhao

独立开发者,主要开发 iOS、watchOS、macOS 应用。

目前在维护 SleepTap、Rooster Time,以及 Markdown Writer 相关工具。

最新文章

谈谈目前阶段我认为的大模型使用策略

技术

先说一个公理:同一个大模型中,参数越高的版本越智能。

从表面上看,既然参数越高的版本越智能,那么在硬件允许的情况下,是否应该本地运行参数更高的版本呢?答案是:是,也不是。这是因为,虽然参数更高的模型更智能,但它们消耗的资源也更高。而且,参数越高的模型,输出所需的时间通常也越长。尤其是如果使用独立显卡进行推理,当模型所需的内存超过显卡的显存时,就会转而使用CPU进行推理,那速度可能会令人无法接受。

相较于本地运行大模型的高参数版本,我更推荐本地运行低参数版本的模型,比如2B、3B这种,同时订阅在线的大模型。尽管这些低参数版本的模型在能力上不及高参数版本强大,但用于一些简单的任务,比如翻译、总结等,效果还是很不错的。而且,它们占用的资源较少,运行速度也相当快。即便是在16GB内存的Mac mini M1上,它们运行时的内存占用也仅在2GB左右。

对于复杂的任务,我们可以将其交给在线的大模型处理。因为相比于在线模型的订阅费,本地运行这些大模型所需的硬件费用远远更高。而在线大模型的好处在于,我们可以根据当前任务选择最合适的模型进行使用。

有人可能会说,若想灵活切换,就需要订阅多个在线大模型,那么费用不就高了吗?其实并非如此。我们可以考虑订阅第三方服务,比如OpenCat。在其订阅期间,我们可以有限制地使用所有它支持的大模型。这样,我们就不必为每个大模型单独订阅。而且,通过这种方式,我们还可以避免一些大模型随意封号的风险。

非官方支持的Mac开启macOS 15.1 AI功能和Xcode AI代码补全功能的办法

技术

github上的文档已经写的很不错了。大家按照上面操作基本上就能成功。就是还有一些注意事项,我会在这里提一提。

https://github.com/Kyle-Ye/XcodeLLMEligible/blob/main/README_CN.md

推荐使用禁用SIP自动运行脚本的方法。

注意:Xcode和苹果AI是两个不同的脚本。需要分别运行。
运行Xcode脚本之前,要先安装完成Xcode 16 beta。不然可能会遇到问题。遇到问题,解决办法就是再次运行一遍Xcode的脚本。

禁用/打开SIP的方法

  1. 关闭Mac。
  2. 长按电源按钮,直到屏幕亮起。
  3. 选择设置。
  4. 选择终端。
  5. 输入命令,按照提示操作。
  6. 重启电脑。

关于墙的碎碎念

技术

7月13号的时候,突然翻不了墙了。但是同时http服务或者SSH服务却全都正常。我以为是我前一天升级了服务器导致的。于是选择了重装。结果还是不行。

经过了一天的调试,最终发现,原来是墙封了我的VPS的IP的433端口。没办法,之后重新又开了一台VPS。

又过了快一周的时间,我在推上看到有人说是因为开会的缘故。

记录一下,下一次就不用浪费这么多时间了。

Ollama运行本地大模型的一些技巧

技术

使用Ollama也有一些时间。从小白阶段,只懂按照命令行运行。到现在会自己从抱抱脸选择官方没有的模型自己进行导入。甚至创建局域网内部的服务器,使用应用调用Ollama的API。是时候总结一下Ollama本地运行大模型的一些技巧了。

运行方式

终端运行

新手一般会使用

ollama serve

启动Ollama,并使用ctrl+c结束运行。

以服务方式运行

我们还可以使用服务的方式运行Ollama。这样Ollama在系统启动之后就会在后台调用,可以随时调用。

brew services start ollama

需要注意的是,如果你是了此种方式。那么每次ollama升级之后,需要使用

brew services restart ollama

重新启动Ollama服务。

服务局域网

默认情况下,Ollama只会关注localhost的11434端口,因此只能从本机访问。局域网的其它电脑无法使用。我们可以修改设置,然后重启Ollama服务。这样局域网内的其它电脑就都可以使用Ollama了。

launchctl setenv OLLAMA_HOST "0.0.0.0"
brew services restart ollama

我们可以这个命令,查看Ollama运行的状态

lsof -i -P | grep ollama

如果你看到的是这个,就证明成功了

ollama      602 zhaoxin    3u  IPv6 0xb435894e8a5320f      0t0  TCP *:11434 (LISTEN)

如果你想固定上面的设置。那么就需要修改/opt/homebrew/opt/ollama/homebrew.mxcl.ollama.plist文件,为它添加:

<key>EnvironmentVariables</key>
<dict>
    <key>OLLAMA_HOST</key>
    <string>0.0.0.0</string>
</dict>

然后停止Ollama服务,并重新开启。注意,我发现用restart不行。必须先stop,然后重新start。不然重启之后,就还是只有localhost。

brew services stop ollama
brew services start ollama

https://github.com/ollama/ollama/blob/main/docs/faq.md
https://github.com/ollama/ollama/issues/3581

模型选择

模型的选择首选是基于功能。不同的模型擅长的领域不同。比如某些模型不支持特定的语言,某些模型具备识别图片的能力,有些模型更擅长编程等。

其次就是版本的选择。总的来说,就是越小的模型,运行时的反应越快,但是同一个模型,越大的模型的输出结果越好。因此,我们需要要在结果准确性和推理速度中作出权衡。一般来说,如果你的电脑只有8GB内存。那么你也就只能选择7B以下的模型,默认模型能跑就不错了。而如果你有16GB内存,那么你最高可以运行13B的模型。而7B模型,也可以选择参数更高的版本比如7B-4bit-K_M之类的。它会标准的标准的4bit性能要好一些。

导入模型

Ollama是llama.cpp的。它支持所有gguf格式模型文件。因此我们在抱抱脸上搜索模型名+gguf,就能下载Ollama官网没有的模型。然后可以通过创建Modefile文件的方式进行导入。格式就是:

FROM gguf文件地址

然后执行

ollama create 模型名 -f Modefile

等一会,这个模型就被导入Ollama了并能使用了。

API调用

下面这段只有程序员需要。

仿OpenAI调用

Ollama支持OpenAI的API的兼容调用方式。这样可以更好复用代码。不过这种方式调用目前只支持chat api的调用。并且不支持Vision。

https://github.com/ollama/ollama/blob/main/docs/openai.md

因此如果你使用下面这两个API的时候,还是需要Ollam的自有API。

ListModels调用

https://github.com/ollama/ollama/blob/main/docs/api.md#list-local-models

Vision调用

https://github.com/ollama/ollama/blob/main/docs/api.md#generate-a-chat-completion

Ubuntu 18.04下将Apache2多站点改为Nginx多站点,同时开启Trojan

技术

最近SSR实在太不稳定了。断断续续的十分难受。于是,趁着还能上的时间,查询新的翻墙方法。经过测试,决定使用Trojan的方式。

原理

Trojan原理

trojan原理

Trojan服务器获得HTTP请求,如果请求的格式正确,就返回代理的数据,否则就返回HTTP网页,这样在第三方看来Trojan就和一台HTTP服务器没区别。

虽然Trojan可以伪装为HTTP服务器,但是它的服务很基本,比如根本不支持虚拟多站点,只能伪装成一个站点。

因此,(为了省钱,)我们还需要另外搭配Nginx来使用。

Trojan+Nginx多站点原理

Trojan+Nginx多站点原理

HTTP访问Nginx,开启了预读模块的Nginx,会对数据流进行分析,如果访问的域名是Trojan预先定义的域名,就访问内部的Trojan端口。否则则访问Nginx的端口。有以下几点需要注意:

  1. Nginx的预读模块本身使用的是443端口,而Nginx模块的HTTP服务使用是4443端口。这是因为,我们需要外部访问服务器时,统一使用443端口,而在服务器内部,通过内部的端口进行中转。
    1. 对于外部(比如防火墙或其它类似设置),理论上我们只需要开启443端口。但是在实际使用中,我发现有些域名会自动跳转到4443端口,因此如果你遇到外部无法访问特定域名的问题,可以开放4443端口试试。
  2. Trojan默认跑在443端口,但是为了配合Nginx使用,需要修改到其它端口,我这里选的是4433端口。
  3. 这个原理,整体来说,就是在外部看来,统一访问443端口。然后Nginx的预读,会分流转发到Trojan和Nginx。

安装

卸载Apache2

sudo apt remove apache2
sudo apt autoremove

删除apache2,之后删除掉不再需要的依赖。

安装Nginx

Ubuntu 18.04自带的Nginx本身没有开启ngx_stream_ssl_preread_module。我们安装Nginx官方提供的版本,这个版本开启了所有的可开启扩展。

sudo vi /etc/apt/sources.list

在文件最下面添加并保存

# for latest nginx
deb http://nginx.org/packages/mainline/ubuntu/ bionic nginx
deb-src http://nginx.org/packages/mainline/ubuntu/ bionic nginx

添加服务器签名,签名在这里nginx_signing.key。点开前面的网页,复制里面的文本内容,保存到nginx_signing.key。不要直接下载。因为是网页,不是纯文本。

sudo apt-key add nginx_signing.key

安装Nginx并开启防火墙端口

sudo apt update
sudo apt install nginx
sudo ufw allow 'Nginx Full'

你现在可以打开浏览器,然后输入vps的ip地址,如果看到了nginx的欢迎界面,就代表nginx配置成功了。

nginx: Linux packages

配置Nginx多站点

假设你有一个网站叫example.com,网页位置在/var/www/html/example.com/html。新建一个配置文件。

sudo vi /etc/nginx/sites-available/example.com

内容如下

server {
	listen 80;
	listen [::]:80;

	server_name example.com www.example.com;

	root `/var/www/html/example.com/html;
	index index.html;

	location / {
		try_files ``uri ``uri/ =404;
	}
}

我们不用添加443端口,因为等下添加证书的时候,Certbot会帮我们自动生成新的配置文件。

将网站配置生效

sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enable
sudo systemctl reload nginx

参考上面的步骤,添加你所有的站点。之后,再额外添加一个站点,用于Trojan的识别。

最后添加的站点,一定要是一个不需要用的二级域名,而不要使用一级域名。因为我发现Nginx的预读有bug。如果你使用了一级域名,那么它的二级域名也都会匹配。这将导致错误。
一级域名指的是example.com这种,二级指的是mail.example.com这种。

这里我们假设额外配置一个叫tro.example.com的二级域名站点。

为Nginx添加SSL证书

通过浏览器访问网站https://certbot.eff.org,选择Nginx和Ubuntu 18.04,安照网站的提示安装certbot。

sudo apt-get update
sudo apt-get install software-properties-common
sudo add-apt-repository universe
sudo add-apt-repository ppa:certbot/certbot
sudo apt-get update
sudo apt-get install certbot python3-certbot-nginx

申请证书

sudo certbot --nginx

按照提示进行操作。完成之后,你再通过浏览器访问网站,你会发现已经是https的了。

安装Trojan

sudo bash -c "$(curl -fsSL https://raw.githubusercontent.com/trojan-gfw/trojan-quickstart/master/trojan-quickstart.sh)"

修改Trojan配置

sudo vi /usr/local/etc/trojan/config.json

找到"local_port",将443,改成4433或者你希望的端口。
找到"password",修改为你想要设置的密码。
找到"ssl",将"cert"设置为“/etc/letsencrypt/live/example.com/fullchain.pem"。将"key"设置为"/etc/letsencrypt/live/example.com/privkey.pem"。

保存并退出。运行Trojan。设置为开机启动。

sudo systemctl start trojan
sudo systemctl enable trojan

配置Trojan+Nginx共存

sudo vi /etc/nginx/nginx.conf

在events和http两段之间,插入

stream {
    map ``ssl_preread_server_name ``name {
        tro.example.com trojan;
        default nginx;
    }
    upstream trojan {
        server 127.0.0.1:4433;
    }
    upstream nginx {
        server 127.0.0.1:4443;
    }
    server {
        listen 443;
        listen [::]:443;
        proxy_pass $name;
        ssl_preread on;
    }
}

保存,修改之前设置的所有网站的设置。打开/etc/nginx/sites-enable/中所有的网站的配置,将所有的443端口,改成4443端口,然后保存。

sudo systemctl reload nginx

在好多支持Trojan的客户端中,域名是可选的。但是由于我们需要使用域名来进行跳转,所以在设置客户端时,域名是必填的,必须填写为tro.example.com。
Module ngx_stream_ssl_preread_module

开启BBR

sudo echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf
sudo echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf
sysctl -p

Ubuntu 18.04/18.10快速开启Google BBR的方法
19.04开始,BBR是默认开启的,不用单独开。

其它

Ubuntu 20.04下安装Nginx与Trojan

ClashXR配置Trojan

macOS Sonoma默认开启磁盘静态加密

技术

昨天将主力系统从macOS Ventura升级到了Sonoma beta 5。今天时光机备份的时候,弹出了一个通知,提示:正在将加密磁盘备份到非加密磁盘。

我很诧异。很多年前,我因为好奇,开启过macOS的磁盘加密功能。后来系统坏掉了,加密的磁盘怎么也进不去,丢了不少资料。打那个时候起,我就不再使用磁盘加密功能了。因为在我看来,加密磁盘对我自身造成的麻烦,大于它给的收益。

所以,我的磁盘是没有使用加密的。难道是升级到新系统之后的那些设置里,有有关磁盘加密的,我没注意就激活了吗?带着这个疑问,我打开设置进行查找。结果“文件保险箱”功能并没有打开,所以我的磁盘并没有全盘加密。

然后我又查看磁盘状态,结果看到了这个:已加密的设置是“否(已静态加密)”。

disk_encryption

我不懂什么是静态加密,于是查询了一下。按照我的理解,这个静态加密,比较类似iPhone上的默认加密。就是当用户没有登录的情况下,磁盘数据是被保护的。只有登录之后,磁盘上的数据才被解锁,才可以访问。

作为对比,我又看了我另外一台还停留在Ventura下的Mac。它的磁盘状态对应的已加密,只有一个简单的“否”。

结论:macOS Sonoma增加了磁盘的安全性。除了以前的文件保险箱功能之外,还提供了默认的静态加密。当然,我不清楚这个特性是不是苹果芯片的Mac独占的,还是英特尔芯片的Mac也有。

macOS Sonoma 14 beta 安装在外置硬盘的方法

技术

WWDC2023来了,新系统也来了。不过安装新系统到外置硬盘却出了问题。经过一天的尝试,我终于解决这个问题。如果你有幸看到这个文章,你也许可以节省掉一个购买雷电3硬盘盒的钱。

安装方法

  1. 下载macOS 14的安装包。
  2. 解包,来到应用程序,找到installer,双击安装。
  3. 选择预先格式化好的磁盘分区进行安装。

这里第一个问题就是苹果并没有提供installer的安装地址。苹果官网只提供了恢复固件。我们可以从这里下载:

https://mrmacintosh.com/macos-sonoma-full-installer-database-download-directly-from-apple/

如果你使用的是usb-c的硬盘盒,一定要看这个!

macOS在使用外置的usb-c的硬盘盒时,如果你同时连接的Mac的usb-c接口,那么有概率安装系统之后,却没法从外置硬盘启动。解决办法是,换线,连接Mac的usb-a接口,然后重装外置硬盘的系统。

  • 如果是usb-c的外置硬盘
    • 连接type-c接口的Mac出现问题
    • 更换type-a接口的Mac,重新装macOS,问题解决
    • 如果是没有type-a的Mac,那么只能使用雷电3接口的硬盘盒。

最后的最后

虽然usb-a的兼容性更好,但是usb-a接口在Mac下的速率只有5Gbps,所以,在发现macOS可以正常启动之后,我尝试将线换回去,重新连到usb-c接口。结果这次,还是能正常启动。而且速度是10Gbps的。

虽然理论上10Gbps是5Gbps的二倍,但是实际使用中,是接近3倍。900MB/s和不到350MB/s。因此强烈建议macOS安装好之后,将线换回去c2c的。

How to install macOS on an external drive

苹果芯片Mac系统降级避坑指南

技术

两天重装了4次macOS,终于搞定了苹果芯片Mac的降级。

起因

升级到macOS 13.3之后,蓝牙相关的好多写作功能都失灵了。比如iPhone热点、接力、手表解锁Mac等。于是想要降级会13.2。

过程

最初的想法很简单。下载macOS 13.2.1安装包,制作安装优盘,然后覆盖安装即可。不过,覆盖安装的时候,提示不能降级。想使用时光机的时候,则提示,时光机不能直接降级,只能用于融合助手。于是只好格盘安装。格盘提示格盘之后会重启系统。

格盘之后的重启是个大坑

我跌进去了三次才最终发现这个坑。一开始,每次融合之后系统都是13.3,而不是13.2.1,我反复核对,发现我的安装盘没问题,选择的时光机镜像也是正确的日期。难道是苹果在后台自动升级了?

结果不是。原因是这个格盘之后的重启。虽然使用的优盘的恢复系统格式化的磁盘,但是重启后自动引导,不是优盘,而是系统默认的恢复。

与英特尔的Mac不同,苹果芯片的Mac不能通过长按键盘快捷键选择启动磁盘,而必须使用长按电源按钮的方式。
因为重启之后我没有长按电源按钮,所以就进入了Mac内置的恢复功能。
但是如果我长按了电源按钮,因为是重启而不是冷启动。电脑会在几秒后强制关机。然后需要再次长按,直到进入选择启动磁盘,然后选择优盘安装即可。

如何分辨是系统启动磁盘安装,还是优盘安装

最明显的是,系统启动磁盘安装是英文版,安装一开始提示还有2个多小时。而如果是优盘安装,安装界面是中文的,而且一开始提示的安装时间不到1小时。

后面就都一样了,不再赘述。