重启系统 按住shift按钮
选择 Advance options for ubuntu
选择 带有 recovery mode
选择 Drop to root shell prompt
按enter选择
输入 : passwd user
就可以重置密码
重启系统 按住shift按钮
选择 Advance options for ubuntu
选择 带有 recovery mode
选择 Drop to root shell prompt
按enter选择
输入 : passwd user
就可以重置密码
好了 初步写了一下啊 micropython的设置:
from machine import Pin,UART
import time,re
class CT511(object):
def __init__(self,tx=0,rx=1,num=0):
self.uart=UART(num, baudrate=115200, tx=Pin(tx), rx=Pin(rx),rxbuf=2048,txbuf=2048)
self.init_system()
print("4G init")
time.sleep(3)
print("done")
self.open_http()
def init_system(self):
return self.uart_write("""AT+QICSGP=1,1,"","",""""")
def open_http(self):
return self.uart_write("""AT$HTTPOPEN""")
def close_http(self):
return self.uart_write("""AT$HTTPCLOSE""")
def start_get(self,url,port=80):
url_cmd_1="AT$HTTPPARA="+url+","+str(port)
url_cmd_2="AT$HTTPACTION=0"
self.uart_write(url_cmd_1)
return self.uart_write(url_cmd_2,10)
# 0.5s GET
# 下面与股票API有关
def uart_write(self,cmd,t=1):
self.uart.write(cmd+"\r")
time.sleep(0.2*t)
return self.uart.read()
def get_gp(self,code="000858",hs="sz"):
if hs=="sz":
hs="sz"
else:
hs="sh"
url="http://qt.gtimg.cn/q="+hs+str(code)
info=self.start_get(url)
if info:
gp=self.get_rev(info)
if gp:
return gp
return False
def get_rev(self,info,status=200):
if b'HTTP/1.1 200 OK' in info:
li=info.split(b"~")
if len(li)>10:
li=info.split(b"~")
gp={}
gp['name']=li[1] #编码问题 无法str
gp['now']=li[3]
gp['yestday']=li[4]
gp['start']=li[5]
gp['ud']=li[31] #涨跌
gp['rate']=li[32] #涨跌率
gp['top']=li[33]
gp['down']=li[34]
gp['buy_n']=li[36]
gp['buy_m']=li[37] #万元
gp['change']=li[38] #成交率
self.gp=gp
return gp
return False
ct511=CT511()
info=ct511.start_get("http://qt.gtimg.cn/q=sz000858")
bal=ct511.get_rev(info)
ct511.get_gp("600020","sh")
#GET取得的原始信息 bytes 混合GBK 需要转str
b'AT$HTTPACTION=0\r\r\n$HTTPRECV:DATA,272\r\nHTTP/1.1 200 OK\r\nDate: Tue, 11 Feb 2025 06:31:12 GMT\r\nContent-Type: text/html; charset=GBK\r\nTransfer-Encoding: chunked\r\nConnection: keep-alive\r\nServer: openresty/1.11.2.1\r\nExpires: Tue, 11 Feb 2025 06:31:12 GMT\r\nCache-Control: max-age=0\r\nAccess-Control-Allow-Origin: *\r\n\r\n\r\n$HTTPRECV:DATA,520\r\nv_sz000858="51~\xce\xe5 \xc1\xb8 \xd2\xba~000858~126.00~127.53~127.60~158580~64547~94021~125.99~1~125.98~8~125.97~62~125.96~56~125.95~80~126.00~7~126.03~7~126.04~38~126.05~7~126.06~16~~20250211143109~-1.53~-1.20~128.07~125.72~126.00/158580/2001872045~158580~200187~0.41~15.14~~128.07~125.72~1.84~4890.72~4890.83~3.87~140.28~114.78~1.09~132~126.24~14.71~16.19~~~1.30~200187.2045~0.0000~0~ ~GP-A~-8.34~-0.94~5.75~23.69~19.58~176.18~103.75~-4.35~-1.76~-18.13~3881525907~3881608005~46.81~-12.56~3881525907~~~-0.27~-0.01~~CNY~0~~126.12~-108";\n\r\nOK\r\n'
状态
\r\nHTTP/1.1 200 OK\r\n
在之
\r\n$HTTPRECV:DATA,520\r\n
后的数据。
直接UART就可以控制 发出HTTP请求:
波特率115200
AT+QICSGP=1,1,"","",""
AT$HTTPOPEN
#设置网址和端口
AT$HTTPPARA=http://httpbin.org/get,80
AT$HTTPACTION=0
#发起请求,会在此返回信息,
#返回信息
$HTTPRECV:DATA,230
HTTP/1.1 200 OK
Date: Sun, 09 Feb 2025 13:39:51 GMT
Content-Type: application/json
Content-Length: 198
Connection: keep-alive
Server: gunicorn/19.9.0
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
$HTTPRECV:DATA,198
{
"args": {},
"headers": {
"Host": "httpbin.org",
"X-Amzn-Trace-Id": "Root=1-67a8b027-423e73b94ca71dfc46cd549e"
},
"origin": "111.55.73.203",
"url": "http://httpbin.org/get"
}
OK
#返回信息
#设置网址和端口 只要没有关闭HTTP 就可以使用发送 可以换get网址
AT$HTTPPARA=http://qt.gtimg.cn/q=sz000858,80
AT$HTTPACTION=0
#发起请求,会在此返回信息,
AT$HTTPCLOSE
查询时间:
AT+CCLK?
+CCLK: “25/02/09,13:46:29+32”
TCP UDP MQTT POST 啥都可以 牛皮
如果本身有GPS 还可以返回GPS信息

日志解释
加载数据集(Loading datasets):
表示模型训练开始前,数据集正在被加载。
训练(Training):
表示模型训练过程的开始。
可训练参数(Trainable parameters):
显示了模型中可训练参数的比例和数量。例如,0.061% (1.090M/1777.088M) 表示模型中有大约1.090百万个可训练参数,占总参数的0.061%。
开始训练(Starting training…):
表示模型训练的开始,并且指定了迭代次数(iters: 1000)。
迭代(Iter):
每个迭代(Iter)记录了训练过程中的一些关键指标,包括:
Val loss:验证集上的损失值,用于评估模型在未见过的数据上的表现。
Val took:完成一次验证所需的时间。
Train loss:训练集上的损失值,用于指导模型参数的更新。
Learning Rate:学习率,控制模型参数更新的步长。
It/sec:每秒迭代次数,表示训练速度。
Tokens/sec:每秒处理的标记数,表示数据处理速度。
Trained Tokens:到目前为止训练过程中处理的标记总数。
Peak mem:训练过程中达到的内存峰值。
示例解释
Iter 1:在第一次迭代中,验证集上的损失值为3.448,完成这次验证用了11.861秒。
Iter 10:在第十次迭代中,训练集上的损失值为10.849,学习率为1.000e-05,每秒迭代次数为2.650,每秒处理的标记数为215.175,到目前为止处理了812个标记,内存峰值为4.617 GB。
迭代次数越多,可以学习损失率越低,之前命令默认迭代次数为1000,最终损失值1.863 ,可以修改下命令中的迭代参数来修改。
--iters 10000
默认 –learning-rate 1e-5 ;解释学习率低:会训练慢,高:训练快,但是会发散,减慢收敛速度。 收敛,模型逐步稳定
--learning-rate 1e-5
W=W + α * ∆W
α 是LoRA Alpha缩放因子
∆W 是 LoRA层的低秩矩阵乘积
∆W--lora-rank 16表示设置 LoRA 的秩为 16,即 r=16,这意味着 B 和 A 矩阵的维度将分别是 d×16 和 16×k。这有助于减少模型的参数量和计算复杂度。
在LoRA(Low-Rank Adaptation)的上下文中,d 和 k 通常指的是模型权重矩阵的维度,具体含义取决于模型架构和权重矩阵的位置。以下是一些常见的解释:
对于自注意力(Self-Attention)层:
d:表示模型的隐藏层维度(hidden size),即每个注意力头处理的特征向量的维度。
k:表示注意力头的数量(number of attention heads)。
对于前馈网络(Feed Forward Network, FFN)层:
d:表示模型的隐藏层维度(hidden size),即FFN层输入和输出的特征向量的维度。
k:表示FFN层内部特征的维度(intermediate size),即FFN层内部的中间特征向量的维度。通常,k 会大于 d,以增加模型的表达能力。
还是要了解一下Transformer
pip install mlx-lm transformers numpy huggingface_hub -i https://mirrors.aliyun.com/pypi/simple/
mkdir deepseek
cd deepseek
export HF_ENDPOINT=https://hf-mirror.com
huggingface-cli download deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B --local-dir R1-1.5B
git clone https://bgithub.xyz/ml-explore/mlx-examples.git
{"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"}
mlx_lm.lora --model ../../R1-1.5B --train --data ./data
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 "超会喝,很勇嘛。身材蛮不错喔,蛮结实的啊。"
好啦!你的阿伟AI已经微调好了!
杰哥!不要啦!