英伟达暴跌1.5万亿,苹果笑了!低配MBP流畅运行LLama3:8b,简单到不需要教程!
文中参考文档点击阅读原文打开, 同时推荐2个学习环境:
1、懒人Docker镜像, 已打包200+插件:《最好的PostgreSQL学习镜像》
2、有web浏览器就能用的云起实验室: 《免费体验PolarDB开源数据库》
3、PolarDB开源数据库内核、最佳实践等学习图谱: https://www.aliyun.com/database/openpolardb/activity
低配MBP成功运行AI大模型LLama3:8b, 感谢ollama
背景
我的macbook算是比较低配了吧? M2芯片, 16G内存, 512G磁盘, 系统版本13.2.1. 值得庆幸的是macbook 的内存是cpu gpu共享的, 所以这个配置意味着GPU最多能用到16G(理论值).
另外需要感谢ollama, 在macOS上实在是太好用了, 而且支持加载各种大模型. 通过ollama拉起大模型有点像通过docker image创建容器的感觉, 非常便利, 怪不得现在这个开源项目已经有79k star.
例子
1、下载ollama for macos. 解压后把ollama应用目录移动到mac的application目录中即可.
https://ollama.com/
https://github.com/ollama/ollama
命令行帮助说明
ollama --help
Large language model runner Usage:
ollama [flags]
ollama [command]
Available Commands:
serve Start ollama
create Create a model from a Modelfile
show Show information for a model
run Run a model
pull Pull a model from a registry
push Push a model to a registry
list List models
ps List running models
cp Copy a model
rm Remove a model
help Help about any command
Flags:
-h, --help help for ollama
-v, --version Show version information
Use "ollama [command] --help" for more information about a command.
2、拉取一个小于内存, 本地能跑的模型.
https://ollama.com/library
llama3:8b 约4.7G, 可以跑起来
U-4G77XXWF-1921:~ digoal$ ollama pull llama3:8b
pulling manifest
pulling 6a0746a1ec1a... 100% ▕██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ 4.7 GB
pulling 4fa551d4f938... 100% ▕██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ 12 KB
pulling 8ab4849b038c... 100% ▕██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ 254 B
pulling 577073ffcc6c... 100% ▕██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ 110 B
pulling 3f8eb4da87fa... 100% ▕██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ 485 B
verifying sha256 digest
writing manifest
removing any unused layers
success
3、运行本地模型
U-4G77XXWF-1921:~ digoal$ ollama list
NAME ID SIZE MODIFIED
llama3:8b 365c0bd3c000 4.7 GB About a minute ago U-4G77XXWF-1921:~ digoal$ ollama run llama3:8b
>>> Send a message (/? for help)
4、考考他, 看看回答速度如何?
>>> 请使用中文回答: 简单介绍一下阿里云PolarDB云原生分布式数据库.
😊 阿里云PolarDB是一款云原生分布式数据库,于2019年推出。它是阿里巴巴集团自主研发的cloud-native分布式关系数据库,可以支持大规模数据存储和处理。PolarDB具备以下特点:
1. **Cloud-Native**:PolarDB 是一款云原生产品,完全基于云计算架构,无需用户维护底层硬件。
2. **Distributed Architecture**:PolarDB 使用分布式架构,可以根据实际需求动态扩展和调整存储和计算资源。
3. **Relational Database**:PolarDB 是关系数据库,支持标准SQL语言,可以与其他数据库集成。
4. **High Availability and Durability**:PolarDB 具有高可用性和数据持久性,可以在出现故障时自动切换到备用节点,以确保业务连续性。
5. **Scalable Performance**:PolarDB 具有可扩展的性能,可以根据实际需求动态调整计算资源,提高应用程序性能。
使用PolarDB可以解决以下问题:
1. 数据存储和处理需求不断增长的问题。
2. 分布式系统架构设计和实现问题。
3. 业务数据安全和高可用性问题。
总的来说,PolarDB 是一款功能强大且灵活的云原生分布式数据库,可以满足复杂应用程序的存储和处理需求。
请使用中文回答(但是SQL text不要使用中文), 输出为markdown格式: 请编写一个postgresql例子, 反映btree,hash,brin,bloom,gist,spgist各个索引接口的差异. 再加一些查询和explain反映使用到这些索引的例子, 最后做个总结, 什么时候使用什么索引.
PostgreSQL 索引示例
使用 BTREE 索引
CREATE TABLE employees (
id INT PRIMARY KEY,
name VARCHAR(50),
age INT
); CREATE INDEX idx_name ON employees USING BTREE (name);
BTREE 索引是最常用的索引类型,用于处理EQ、NEQ、LT、LE、GT、GE、IN、NOT IN 等查询。
查询示例
SELECT * FROM employees WHERE name = 'John';
Explain:
EXPLAIN SELECT * FROM employees WHERE name = 'John';
结果:
"Index Scan using idx_name on employees (cost=0.29..8.28 rows=1 width=64) (actual time=0.021..0.021 rows=1 loops=1)"
可以看到,PostgreSQL 使用 BTREE 索引来查找 name='John' 的记录。
使用 HASH 索引
CREATE TABLE orders (
id INT PRIMARY KEY,
customer_id INT NOT NULL,
total DECIMAL(10, 2)
); CREATE INDEX idx_customer_id ON orders USING HASH (customer_id);
HASH 索引用于快速查找单个值,通常用于 IN、NOT IN 等查询。
查询示例
SELECT * FROM orders WHERE customer_id = 123;
Explain:
EXPLAIN SELECT * FROM orders WHERE customer_id = 123;
结果:
"Index Only Scan using idx_customer_id on orders (cost=0.29..8.28 rows=1 width=64) (actual time=0.021..0.021 rows=1 loops=1)"
可以看到,PostgreSQL 使用 HASH 索引来快速查找 customer_id=123 的记录。
使用 BRIN 索引
CREATE TABLE sensor_data (
id INT PRIMARY KEY,
timestamp TIMESTAMP NOT NULL,
value DECIMAL(10, 2)
); CREATE INDEX idx_timestamp ON sensor_data USING BRIN (timestamp);
BRIN 索引用于快速查找范围查询,通常用于时间戳或日期范围查询。
查询示例
SELECT * FROM sensor_data WHERE timestamp BETWEEN '2020-01-01' AND '2020-12-31';
Explain:
EXPLAIN SELECT * FROM sensor_data WHERE timestamp BETWEEN '2020-01-01' AND '2020-12-31';
结果:
"BRIN Scan using idx_timestamp on sensor_data (cost=0.29..8.28 rows=100 width=64) (actual time=0.021..0.021 rows=100 loops=1)"
可以看到,PostgreSQL 使用 BRIN 索引来快速查找 timestamp 在指定范围内的记录。
使用 BLOOM 索引
CREATE TABLE products (
id INT PRIMARY KEY,
category VARCHAR(50),
price DECIMAL(10, 2)
); CREATE INDEX idx_category ON products USING BLOOM (category);
BLOOM 索引用于快速查找多个值,通常用于LIKE、IN、NOT IN 等查询。
查询示例
SELECT * FROM products WHERE category LIKE '%electronics%';
Explain:
EXPLAIN SELECT * FROM products WHERE category LIKE '%electronics%';
结果:
"Bloom Scan using idx_category on products (cost=0.29..8.28 rows=100 width=64) (actual time=0.021..0.021 rows=100 loops=1)"
可以看到,PostgreSQL 使用 BLOOM 索引来快速查找 category 中包含 'electronics' 的记录。
使用 GIST 索引
CREATE TABLE shapes (
id INT PRIMARY KEY,
shape geometry NOT NULL
); CREATE INDEX idx_shape ON shapes USING GIST (shape, gist_index);
GIST 索引用于处理空间数据,通常用于 GIS 应用程序。
查询示例
SELECT * FROM shapes WHERE ST_DWithin(shape, 'POINT(1 2)', 10);
Explain:
EXPLAIN SELECT * FROM shapes WHERE ST_DWithin(shape, 'POINT(1 2)', 10);
结果:
"GIST Scan using idx_shape on shapes (cost=0.29..8.28 rows=100 width=64) (actual time=0.021..0.021 rows=100 loops=1)"
可以看到,PostgreSQL 使用 GIST 索引来快速查找 shape 中包含指定点的记录。
使用 SPGIST 索引
CREATE TABLE paths (
id INT PRIMARY KEY,
path geometry NOT NULL
); CREATE INDEX idx_path ON paths USING SPGIST (path, spgist_index);
SPGIST 索引用于处理空间路径数据,通常用于 GIS 应用程序。
查询示例
SELECT * FROM paths WHERE ST_DWithin(path, 'LINESTRING(0 0, 1 1)', 10);
Explain:
EXPLAIN SELECT * FROM paths WHERE ST_DWithin(path, 'LINESTRING(0 0, 1 1)', 10);
结果:
"SPGIST Scan using idx_path on paths (cost=0.29..8.28 rows=100 width=64) (actual time=0.021..0.021 rows=100 loops=1)"
可以看到,PostgreSQL 使用 SPGIST 索引来快速查找 path 中包含指定路径的记录。
总结:
BTREE 索引用于等值查询和范围查询 HASH 索引用于 IN 和 NOT IN 查询 BRIN 索引用于范围查询 BLOOM 索引用于多个值查询 GIST 索引用于空间数据查询 SPGIST 索引用于空间路径数据查询
选择合适的索引类型,能够提高数据库性能和查询效率。
小结
1、使用ollama可以非常方便的在M芯片系列的mac上跑AI大模型.
2、速度很快, 一秒20个字左右吧(M2芯片, 16G内存, 512G磁盘).
3、llama3:8b 下载4.7G, 实际内存消耗可能小一点, 因为我配置了内存压缩, 可能有一定的作用. 参考:
《禁用 MacOS 的 Swap 分区 - 实测真实有效》
4、结果大家可以多测试一下, 反正里面很多错误, 千万别当真. 例如bloom的例子有问题, hash也不能用于not in. 不过能跑起来已经很有趣了. 未来有好的硬件可以试试更大参数量的模型, 或者进行一些微调.
参考
https://ollama.com/
https://cloud.tencent.com/developer/article/2412384
https://www.cybertec-postgresql.com/en/using-ai-to-generate-data-structures/
https://github.com/ollama/ollama
https://github.com/mindsdb/mindsdb
本期彩蛋-招商中,有需要的小伙伴可联系嵌入...
文章中的参考文档请点击阅读原文获得.
欢迎关注我的github (https://github.com/digoal/blog) , 学习数据库不迷路.
近期正在写公开课材料, 未来将通过视频号推出, 欢迎关注视频号: