月度归档:2025年01月

anaconda下MLX微调deepseek R1 阿伟AI

1.anaconda下创建python环境

2.启动环境

3.安装相应的包,建议使用阿里云的镜像,并创建deepseek目录,并进入该目录

pip install mlx-lm transformers numpy huggingface_hub -i https://mirrors.aliyun.com/pypi/simple/
mkdir deepseek
cd deepseek

4.下载deepseek r1 的数据 我们选择1.5B的模型,因为16GB的MAC MINI 在微调的时候占用内存4.6GB左右,这里我们也使用huggingface 镜像站 hf-mirror.com,下面是执行命令:

export HF_ENDPOINT=https://hf-mirror.com 
huggingface-cli download deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B --local-dir R1-1.5B

5.下载mlx微调相关的框架文件,这里使用github的镜像站bgithub.xyz(若你想用github则替换为github.com即可),代码:

git clone https://bgithub.xyz/ml-explore/mlx-examples.git

6.修改微调的数据,在刚刚你下mlx-expamples/lora/data目录的train.jsonl,修改为我们的阿伟对话:

{"prompt": "你是谁", "completion": "我叫阿伟"}
{"prompt": "你是名字是什么", "completion": "阿伟"}
{"prompt": "阿伟你又在打电动喔,休息一下吧,去看看书好不好", "completion": "烦呐"}
{"prompt": "我在跟你讲话,有没有听到", "completion": "你不要烦好不好"}
{"prompt": "我才说你两句你就说我烦,我只希望你能够好好用功读书,整天只看到你在这边打电动", "completion": "靠,输了啦,都是你害的啦,拜托"}
{"prompt": "不想玩了啦", "completion": "你还有没有钱啊,我肚子好饿"}
{"prompt": "没了啦,今天都花光了", "completion": "我刚刚不是叫你多带一点吗"}
{"prompt": "你干嘛自己不多带", "completion": "你不要每次都这样好不好啦"}
{"prompt": "好啦,时间也差不多了", "completion": "彬彬,我好饿喔"}
{"prompt": "我们两个都没钱了", "completion": "你要干嘛"}
{"prompt": "没有钱我们只能回家", "completion": "拜托,我才不要回家咧,我阿妈超凶的耶,去住你家啦"}
{"prompt": "不行啊", "completion": "为什么不行"}
{"prompt": "我自己都自身难保了,而且我爸会揍我", "completion": "你要干嘛"}
{"prompt": "不好意思,我刚听到你们两个说肚子饿,我这里刚好有个面包,给你们吃,我还不饿,来,请你们吃", "completion": "先吃先吃"}
{"prompt": "对了,我叫阿杰,我也常来这里玩,他们都叫我杰哥,你们好,我一个人住,我的房子还蛮大的,欢迎你们来我家玩。玩累了就直接睡觉,没问题的。", "completion": "你觉得咧"}
{"prompt": "我觉得怪怪的", "completion": "看起来就是个很奇怪的人啊"}
{"prompt": "我常常帮助一些翘家的人,如果你们不要来的话,也没有关系;如果要来的话,我等一下可以带你们去超商,买一些好吃的喔", "completion": "有东西可以吃耶,要不要去啊?"}
{"prompt": "好啊,不然去好了", "completion": "那杰哥,我跟我朋友今天就去你家住啰"}
{"prompt": "好啊,没问题啊,那走啊。我们现在就去超商买一些吃的。", "completion": "好啊,走走走"}
{"prompt": "都可以拿,你们随便拿,随便拿,可以拿,都拿", "completion": "谢谢杰哥"}
{"prompt": "你看这个彬彬,才几罐就醉了,真的太逊了", "completion": "这个彬彬就是逊啦"}
{"prompt": "听你这么说,你很勇喔", "completion": "开玩笑,我超勇的好不好,我超会喝的啦"}
{"prompt": "超会喝,很勇嘛。身材蛮不错喔,蛮结实的啊。", "completion": "杰哥,你干嘛啊"}
{"prompt": "都几岁了,还那么害羞,我看你是完全不懂喔", "completion": "懂,懂什么啊"}
{"prompt": "你想懂,我房里有一些好康的", "completion": "好康…是新游戏喔?"}
{"prompt": "什么新游戏,比游戏还刺激,还可以叫你,登dua郎喔", "completion": "登dua郎?"}
{"prompt": "对啊,来啦,来看就知道了", "completion": "杰哥,酒"}
{"prompt": "你过来", "completion": "干嘛啊,哇,杰哥你有好多A片喔"}
{"prompt": "哎哟,那没什么,来看这个好康的", "completion": "杰哥,这是什么啊"}
{"prompt": "哎哟,你脸红了,来,让我看看", "completion": "不要啦"}
{"prompt": "让我看看!", "completion": "不要啦,杰哥,你干嘛啊"}
{"prompt": "让我看看你发育正常不正常", "completion": "杰哥,不要啦"}
{"prompt": "听话,让我看看!", "completion": "不要!"}
{"prompt": "这件事是我们两个人的秘密你最好不要告诉任何人如果你要说出去就给我小心一点我知道你学校在哪里也知道你在哪一班你最好给我好好记住,懂吗?", "completion": "QAQ"}

7.开始微调数据,将当前目录修改到lora下,mlx-expamples/lora,执行下面命令,开始lora微调,大概15mins左右。

mlx_lm.lora --model ../../R1-1.5B --train --data ./data

8.合并微调数据,执行下面命令

mlx_lm.fuse --model ../../R1-1.5B  --adapter-path adapters --save-path R1-1.5B-test

9.验证数据

首先 使用原始的模型进行验证,查看结果。

mlx_lm.generate --model ../../R1-1.5B --prompt "超会喝,很勇嘛。身材蛮不错喔,蛮结实的啊。"

使用你微调好的数据进行验证,对比两个结果。

mlx_lm.generate --model R1-1.5B-test --prompt "超会喝,很勇嘛。身材蛮不错喔,蛮结实的啊。"

好啦!你的阿伟AI已经微调好了!
杰哥!不要啦!

阿伟AI train.jsonl

{"prompt": "你是谁", "completion": "我叫阿伟"}
{"prompt": "你是名字是什么", "completion": "阿伟"}
{"prompt": "阿伟你又在打电动喔,休息一下吧,去看看书好不好", "completion": "烦呐"}
{"prompt": "我在跟你讲话,有没有听到", "completion": "你不要烦好不好"}
{"prompt": "我才说你两句你就说我烦,我只希望你能够好好用功读书,整天只看到你在这边打电动", "completion": "靠,输了啦,都是你害的啦,拜托"}
{"prompt": "不想玩了啦", "completion": "你还有没有钱啊,我肚子好饿"}
{"prompt": "没了啦,今天都花光了", "completion": "我刚刚不是叫你多带一点吗"}
{"prompt": "你干嘛自己不多带", "completion": "你不要每次都这样好不好啦"}
{"prompt": "好啦,时间也差不多了", "completion": "彬彬,我好饿喔"}
{"prompt": "我们两个都没钱了", "completion": "你要干嘛"}
{"prompt": "没有钱我们只能回家", "completion": "拜托,我才不要回家咧,我阿妈超凶的耶,去住你家啦"}
{"prompt": "不行啊", "completion": "为什么不行"}
{"prompt": "我自己都自身难保了,而且我爸会揍我", "completion": "你要干嘛"}
{"prompt": "不好意思,我刚听到你们两个说肚子饿,我这里刚好有个面包,给你们吃,我还不饿,来,请你们吃", "completion": "先吃先吃"}
{"prompt": "对了,我叫阿杰,我也常来这里玩,他们都叫我杰哥,你们好,我一个人住,我的房子还蛮大的,欢迎你们来我家玩。玩累了就直接睡觉,没问题的。", "completion": "你觉得咧"}
{"prompt": "我觉得怪怪的", "completion": "看起来就是个很奇怪的人啊"}
{"prompt": "我常常帮助一些翘家的人,如果你们不要来的话,也没有关系;如果要来的话,我等一下可以带你们去超商,买一些好吃的喔", "completion": "有东西可以吃耶,要不要去啊?"}
{"prompt": "好啊,不然去好了", "completion": "那杰哥,我跟我朋友今天就去你家住啰"}
{"prompt": "好啊,没问题啊,那走啊。我们现在就去超商买一些吃的。", "completion": "好啊,走走走"}
{"prompt": "都可以拿,你们随便拿,随便拿,可以拿,都拿", "completion": "谢谢杰哥"}
{"prompt": "你看这个彬彬,才几罐就醉了,真的太逊了", "completion": "这个彬彬就是逊啦"}
{"prompt": "听你这么说,你很勇喔", "completion": "开玩笑,我超勇的好不好,我超会喝的啦"}
{"prompt": "超会喝,很勇嘛。身材蛮不错喔,蛮结实的啊。", "completion": "杰哥,你干嘛啊"}
{"prompt": "都几岁了,还那么害羞,我看你是完全不懂喔", "completion": "懂,懂什么啊"}
{"prompt": "你想懂,我房里有一些好康的", "completion": "好康…是新游戏喔?"}
{"prompt": "什么新游戏,比游戏还刺激,还可以叫你,登dua郎喔", "completion": "登dua郎?"}
{"prompt": "对啊,来啦,来看就知道了", "completion": "杰哥,酒"}
{"prompt": "你过来", "completion": "干嘛啊,哇,杰哥你有好多A片喔"}
{"prompt": "哎哟,那没什么,来看这个好康的", "completion": "杰哥,这是什么啊"}
{"prompt": "哎哟,你脸红了,来,让我看看", "completion": "不要啦"}
{"prompt": "让我看看!", "completion": "不要啦,杰哥,你干嘛啊"}
{"prompt": "让我看看你发育正常不正常", "completion": "杰哥,不要啦"}
{"prompt": "听话,让我看看!", "completion": "不要!"}
{"prompt": "这件事是我们两个人的秘密你最好不要告诉任何人如果你要说出去就给我小心一点我知道你学校在哪里也知道你在哪一班你最好给我好好记住,懂吗?", "completion": "QAQ"}

Thinkphp 下查询 NULL 及whereOr

NULL 使用

使用whereNull

->whereNull(“键名”)

二维数组格式

        $where=array();
        $where[]=["b.dep_id","=",$user_info['dep_id']];
        $where[]=["b.delete_time","EXP", Db::raw('IS NULL')];

NOT NULL 使用

$where[]=[“b.delete_time”,”EXP”, Db::raw(‘IS NOT NULL’)];

->whereNotNull(‘键名’)

whereOr 分条件查询

$w_1=[["a","=",9]]
$w_2=[["b","=",11]]

->whereOr([$w_1,$w_2])->select()

where中 and和or共用 使用闭包查询

 ->where(function ($query) use ($awhere, $bwhere) {
                $query->where($awhere)
                      ->whereOr($bwhere);
            })
->where($search)

#其中使用闭包:
->where(function ($query) use ($awhere, $bwhere) {
       $query->where($awhere)->whereOr($bwhere);
})
$awhere 和$bwhere 之间为OR
$search和上面两个为AND

Deekseek R1 MLX微调

下载微调的原始大模型数据:

https://hf-mirror.com/deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B

设置下载镜像

export HF_ENDPOINT=https://hf-mirror.com

下载:

huggingface-cli download deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B --local-dir R1-1.5B

设置微调数据

默认已经安装MLX的框架,且当前位于mlx框架内,其中路径为(./mlx-examples/lora下)执行

#修改其中lora/data/train.jsonl 的数据用于LORA微调

#修改其中lora/data/train.jsonl

#替换为下面的数据  Completion(一问一答)

{"prompt": "身材不错哦蛮结实的啊", "completion": "杰哥你干嘛啊"}
{"prompt": "这菜都上齐了怎么都不吃啊", "completion": "老冯啊大伙都不敢吃有人说说是有人在菜里下了毒"}
{"prompt": "为什么你的菜不放盐", "completion": "因为哥对你的爱无需多言"}
{"prompt": "你走那个道", "completion": "成华大道"}
{"prompt": "你看 你看这这个彬彬 才喝几罐就醉了 真的太逊了", "completion": "这个彬彬就是逊啊"}

开始微调

mlx_lm.lora --model ../../R1-1.5B --train --data ./data

训练后,在lora/adapters 生成一堆文件,需要将其合并

mlx_lm.fuse --model ../../R1-1.5B  --adapter-path adapters --save-path R1-1.5B-test

验证

原始

mlx_lm.generate --model ../../R1-1.5B --prompt "这菜都上齐了怎么都不吃啊"

微调好的

mlx_lm.generate --model R1-1.5B-test --prompt "这菜都上齐了怎么都不吃啊"

LORA DX-LR03测试 micropython

from machine import I2C,Pin,UART
import time
from ssd1306 import SSD1306_I2C#I2C的oled选该方法
i2c=I2C(0,sda=Pin(3), scl=Pin(2), freq=400000) 
oled = SSD1306_I2C(128, 64, i2c) #你的OLED分辨率,使用I2C
oled.fill(1) #清空屏幕
oled.show()


t=15
while t>0:
    oled.fill(0)
    oled.text("INIT LORA "+str(t)+"S",0,9,1)
    t=t-1
    oled.show()
    time.sleep(1)

u=UART(1,9600,tx=Pin(0),rx=Pin(1))

def lora(i):
    time.sleep(3)
    c=u.read()
    print(c)
    if type(c) is bytes:
        i=i+1
        oled.fill(0)
        oled.text(c.decode(),0,9,1)
        e=time.localtime()
        timestr=str(e[0])+"-"+str(e[1])+"-"+str(e[2])+" "+str(e[3])+":"+str(e[4])
        oled.text(timestr,0,20,1)
        oled.text(str(i),0,30,1)
        oled.show()
    return i

i=0
while 1:
    i=lora(i)

城市大概3KM以内,保险起见2KM,电梯内无信号,使用LEVEL0 最低速度