利用蓝耘智算平台深度搭建deepseek R1模型,进行深度机器学习
大佬请阅读
- 前言
- 关于DeepSeek 的显著优点
- 卓越的性能表现
- 低廉的训练成本
- 广泛的应用场景
- 开放的开源策略
- DeepSeek 与其他 AI 对比
- 什么是蓝耘智算平台
- 为什么使用蓝耘智算平台搭建我们的deepseek
- 如何使用蓝耘 GPU 智算云平台搭建我们的R1模型并成功进行调用
- 测试1
- 1. AVL树节点结构
- 2. 插入操作
- 3. 删除操作
- 4. 旋转操作(通用版本)
- 5. 注释说明
- 6. 使用示例
- 测试2
- 说明:
- 输出结果:
- 改进方向:
- 总结
前言
在人工智能技术日新月异的时代,AI 模型如雨后春笋般不断涌现,各自在不同领域施展着独特的能力。DeepSeek 以其独有的特性,在 AI 的浩瀚星空中散发着耀眼光芒。接下来,我们将深入剖析 DeepSeek 的优点以及如何利用蓝耘智算平台搭建好我们的deepseek R1模型
关于DeepSeek 的显著优点
卓越的性能表现
-
语言生成:DeepSeek 在语言生成方面表现卓越,尤其在中文语境下优势突出。它能够生成高度符合中文表达习惯的文本,无论是日常对话、文案创作还是学术写作,都能精准把握语义,输出流畅自然的内容。而且在多轮对话中,它能很好地保持连贯性,理解上下文含义,给出贴合语境的回答。
-
逻辑推理:面对复杂的逻辑推理任务,DeepSeek 毫不逊色。无论是数学问题求解,还是复杂的逻辑分析,它都能凭借强大的算法和训练数据,条理清晰地进行推理,给出准确的答案和完整的推理过程。
-
计算效率:DeepSeek 的模型设计经过优化,在保证高性能的同时,对计算资源的消耗较低。这使得它可以在资源有限的环境中高效部署,无论是小型企业的服务器,还是个人电脑,都能轻松运行,大大降低了使用门槛。
低廉的训练成本
以 DeepSeek-V3 为例,其拥有 671 亿参数量和 37 亿激活参数,预训练 token 量高达 14.8 万亿,但训练成本却仅为同类模型 GPT-4o 的二十分之一。如此低的训练成本,使得企业和开发者在大规模应用时,无需承担高昂的费用,能够更经济高效地利用资源。
广泛的应用场景
DeepSeek 适用于多种场景,在智能客服领域,它能快速准确地响应客户咨询,提升客户满意度;在内容创作方面,能为创作者提供创意灵感、生成大纲甚至具体内容;在教育辅助中,帮助学生答疑解惑,辅助教师备课;在数据分析时,能从海量数据中挖掘有价值的信息。
开放的开源策略
DeepSeek 完全开源且支持免费商用和衍生开发,这吸引了全球众多开发者参与到生态建设中。开源不仅提高了模型的透明度,还促进了全球开发者的协作与改进,使得基于 DeepSeek 的创新应用不断涌现,进一步推动了 AI 技术的发展。
DeepSeek 与其他 AI 对比
对比维度 | DeepSeek | GPT-4o | Google Gemini |
语言生成能力 | 中文语境下表现突出,生成文本自然流畅,多轮对话连贯性强 | 整体语言生成能力优秀,但在中文语境下的独特优势不如 DeepSeek | 在多模态融合下的语言生成有特色,但纯文本生成能力稍逊 |
逻辑推理能力 | 面对复杂数学和逻辑问题,推理准确且过程清晰 | 逻辑推理能力强,是行业标杆之一 | 在逻辑推理上表现尚可,但重点在多模态任务 |
计算效率 | 对计算资源消耗低,适合在资源有限环境部署 | 计算资源需求高,部署成本相对较高 | 计算资源需求因任务而异,多模态任务资源需求较大 |
训练成本 | 以 DeepSeek-V3 为例,训练成本仅为 GPT-4o 的二十分之一 | 训练成本高昂 | 训练成本较高,具体数据因模型版本而异 |
应用场景 | 智能客服、内容创作、教育辅助、数据分析等,在企业级应用优势明显 | 广泛应用于各类自然语言处理场景 | 专注于多模态任务,如图像描述、视频分析等 |
开源与专有性 | 完全开源,支持免费商用和衍生开发 | 部分新模型采取专有模式,限制开发者自由使用和深度开发 | 部分开源,多模态相关核心技术专有性较强 |
综上所述,DeepSeek 在性能、成本、应用和开源等多方面展现出独特优势,尤其是在中文语境和企业级应用场景中表现突出。不同的 AI 模型各有所长,用户在选择时应综合自身需求、预算和应用场景等因素,挑选最适合的 AI 工具。而 DeepSeek 凭借其独特魅力,已在 AI 领域占据重要地位,并有望在未来持续拓展应用边界,为更多领域带来创新变革。
什么是蓝耘智算平台
蓝耘 GPU 智算云平台是依托 Kubernetes 搭建的现代化云平台,具备行业领先的灵活基础设施,以及大规模 GPU 算力资源。它为用户提供开放、高性能且性价比高的算力云服务,全方位助力 AI 客户开展模型构建、训练和推理的全业务流程,同时也为教科研客户加速科研创新。平台致力于为科研工作者、工程师以及创新者打造无可比拟的计算解决方案,其运算速度比传统云服务提供商快 35 倍,成本却降低了 30%。
在大模型训练场景下,蓝耘算力云平台将运行环境、模型以及训练框架统一打包至容器中,借助定制化的 Kubernetes 容器编排工具,实现容器的调度、管理与扩展。这一举措有效解决了开发环境设置、运维和管理等方面的问题,算法工程师能够运用统一的环境模板进行开发,避免了初期繁杂的开发环境搭建,以及在新环境中管理新算力资源的困扰,为用户提供了便捷的、开箱即用的大模型训练与推理平台。
不仅如此,针对大模型训练中常见的容器进程死机、大规模分布式训练中 GPU 驱动丢失、GPU 硬件损坏、计算节点宕机等难题,蓝耘 GPU 智算云平台都进行了定制化设计,具备自动化调度能力和强大的自愈能力,大幅提升了开发和训练效率,提高了整体资源利用率。
为什么使用蓝耘智算平台搭建我们的deepseek
我们有时候在使用deepseek的时候总是会出现服务器繁忙报错的情况,这样就让我们很难受,如果选择本地部署的话,不仅仅占用我们的内存,最小的模型就需要1GB,而且对我们显卡的要求比较高,并且我们下载的本地模型,调用起来的时候不是那么的智能,有时候也会出现答非所问的情况,所以这个时候我们需要利用我们蓝耘智算平台来进行deepseek R1模型的搭建和调用,使用联网状态的deepseek R1模型,这就可以相较于离线的模型更加智能了
如何使用蓝耘 GPU 智算云平台搭建我们的R1模型并成功进行调用
-
我们可以在蓝耘 GPU 智算云平台进行注册,填写对应的信息我们就可以注册账号,注册好账号之后我们点击已有账号,再次输入我们的账号密码进行登录就行了
-
登录进来之后就是下面的界面,我们点击这个左上角的应用市场,我们可以看到很多的AI大模型,第一个就是我们的deepseek R1模型
-
这里的话为了各位大佬可以看的更加清晰,我们这里使用我们的deepseek-r1_1.5b_7b_8b这个模型
-
点进去我们可以发现相关的介绍,如果使用以及如何进行部署都写的很先详细
DeepSeek在R1模型的基础上,使用Qwen和Llama蒸馏了几个不同大小的模型,适配目前市面上对模型尺寸的最主流的几种需求。Qwen和Llama系列模型架构相对简洁,并提供了高效的权重参数管理机制,适合在大模型上执行高效的推理能力蒸馏。蒸馏的过程中不需要对模型架构进行复杂修改 减少了开发成本 【 默认账号: lanyunuser@lanyun.net 密码:lanyunuser】
-
我们点击这个右上角的部署按钮,他会弹出我们的配置表格,我们这里选择按量付费,用多少付多少,GPU的型号的话我们选择这个 RTX 4090 ,显存:24GB 内存:120GB 系统盘:30GB SSD
-
GPU卡数的话我们就选择1就行了,如果有大规模需求的话可以多加几个显卡,然后点击购买我们就搞定了
-
如果弹出这个提示的话,我们直接点击确定就行了,然后会直接跳转到我们调用的界面
-
然后等待几分钟等待我们模型的创建,点击这个快速启动应用我们就可以进入到我们deepseek R1模型的使用可视化界面了
-
输入我们在前面应用介绍里面说到的账号密码我们进行登录操作
【 默认账号: lanyunuser@lanyun.net 密码:lanyunuser】 -
点击登录我们就能使用我们的deepseek R1大模型了
这里我们先询问请帮我写出AVL的左右双旋的代码以及详细的注释
deepseek 可以显示他的思考过程以及最终的答案
测试1
1. AVL树节点结构
每个节点包含:
value
: 数据值;left
: 左孩子指针;right
: 右孩子指针;height
: 节点的高度(左高于右)。
2. 插入操作
插入一个新的节点时,可能需要进行一次或多次旋转以确保树的平衡。
public void insert(Node node) {
Node parent = null;
int heightDiff = Integer.MIN_VALUE;
// 找到插入位置的父节点
while (parent != null && Math.abs(height(parent.left) - height(parent.right)) > 1) {
if (height(parent.left) > height(parent.right)) {
if (parent.left == null) {
parent.left = node;
} else {
// 左右双旋:先右旋后左旋
rotateRight(parent);
}
} else {
if (parent.right == null) {
parent.right = node;
} else {
// 左右双旋:先左旋后右旋
rotateLeft(parent);
}
}
// 更新父节点的高度差
heightDiff = Math.abs(height(parent.left) - height(parent.right));
parent = parent.parent;
}
// 当前节点是新插入的叶子节点
if (parent != null && parent.left == node || parent.right == node) {
// 调整父节点的高度
parent.height = 1 + Math.max(height(parent.left), height(parent.right));
} else {
// 这个情况不会发生,除非树为空
throw new RuntimeException("Error: insert logic failed");
}
}
3. 删除操作
删除一个节点时,也可能需要进行一次或多次旋转以确保树的平衡。
public void delete(Node node) {
if (node == null || node.left == null && node.right == null) {
return;
}
Node parent = findParent(node);
// 确定哪个方向需要删除
if (parent == null || (parent.left == node && height(parent.left) > height(parent.right))) {
deleteLeft(parent);
} else {
deleteRight(parent);
}
}
private void deleteLeft(Node node) {
Node rightChild = node.right;
node.right = null;
// 调整高度
int newHeight = height(node.left) >= height(rightChild) ? height(node.left) : height(node.left) + 1;
node.height = newHeight;
// 左旋
rotateLeft(node);
// 调整父节点的高度(如果有的话)
if (node.parent != null) {
int leftHeight = height(node.parent.left);
int rightHeight = height(node.parent.right);
node.parent.height = 1 + Math.max(leftHeight, rightHeight);
}
}
private void deleteRight(Node node) {
Node leftChild = node.left;
node.left = null;
// 调整高度
int newHeight = height(node.right) >= height(leftChild) ? height(node.right) : height(node.right) + 1;
node.height = newHeight;
// 右旋
rotateRight(node);
// 调整父节点的高度(如果有的话)
if (node.parent != null) {
int leftHeight = height(node.parent.left);
int rightHeight = height(node.parent.right);
node.parent.height = 1 + Math.max(leftHeight, rightHeight);
}
}
// 返回指定节点的父节点
private Node findParent(Node node) {
// 从根开始向上遍历直到找到正确的父节点
Node current = root;
while (current != null && !isChild(current, node)) {
current = current.left != null ? current.left : current.right;
}
return current;
}
// 判断一个节点是否是另一个节点的左孩子或右孩子
private boolean isChild(Node parent, Node child) {
return (parent.left == child || parent.right == child);
}
4. 旋转操作(通用版本)
public void rotateRight(Node node) {
// 原来是 node -> node.left -> node.left.left
// 旋转后,node.right变成新的左孩子
Node rightChild = node.right;
node.right = rightChild.right;
rightChild.right = null;
// 调整高度
if (height(node.left) > height(node.right)) {
node.height++;
} else {
node.height = 1 + Math.max(height(node.left), height(node.right));
}
}
public void rotateLeft(Node node) {
// 原来是 node -> node.right -> node.right.right
// 旋转后,node.right变成新的右孩子
Node leftChild = node.left;
node.left = leftChild.left;
leftChild.left = null;
// 调整高度
if (height(node.right) > height(node.left)) {
node.height++;
} else {
node.height = 1 + Math.max(height(node.left), height(node.right));
}
}
5. 注释说明
-
插入操作:
- 遍历到合适的位置后,判断当前父节点是否满足平衡条件。
- 如果不满足,进行左右双旋(先右旋再左旋或先左旋再右旋)。
- 调整父节点高度。
-
删除操作:
- 找到目标节点的父节点。
- 根据需要删除的方向(左或右),执行相应的旋转。
- 调整被删节点的父节点高度。
-
旋转操作:
rotateRight
:将右子树提上来作为新的左子树。rotateLeft
:将左子树提上来作为新的右子树。- 调整节点高度,确保递归调用正确计算高度。
6. 使用示例
// 初始化根节点
Node root = new Node(1);
root.left = new Node(2);
root.right = new Node(3);
// 插入节点4到右边的子树中
insert(root, 4, root.right);
// 删除节点3
delete(root, root.right);
// 输出验证
System.out.println("AVL Tree after operations:");
printTree(root);
测试2
我们这里让deepseek随机生成一个机器学习的代码,生成的代码依旧不赖,并且这个思考过程考虑的很充分
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report, roc_auc_score
from sklearn.preprocessing import StandardScaler
# 1. 加载数据集
# 这里假设你有一个CSV文件存储的手写数字,格式类似于以下:
"""
digits.csv:
0,1,2,3,4,5,6,7,8,9
0,1,2,3,4,5,6,7,8,9
...
0,1,2,3,4,5,6,7,8,9
...
"""
data = pd.read_csv('digits.csv')
# 2. 划分训练集和测试集
X = data.drop(columns=['0','1','2','3','4','5','6','7','8','9']) # 如果数据中每行有10个数字作为特征
y = data['0'] # 这里假设第一列是目标变量(第一个数字)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 3. 标准化数据(如果特征有很大的范围)
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
# 4. 创建随机森林分类模型
model = RandomForestClassifier(random_state=42, n_estimators=10)
# 5. 训练模型
model.fit(X_train_scaled, y_train)
# 6. 预测测试集的结果
y_pred = model.predict(X_test_scaled)
y_proba = model.predict_proba(X_test_scaled)[:, :2]
# 7. 计算评估指标
print("训练准确率:", accuracy_score(y_train, model.fit_transform(X_train_scaled).argmax(axis=1)))
print("\n验证准确率:", accuracy_score(y_test, y_pred))
print("\n分类报告:")
print(classification_report(y_test, y_pred))
# 可视化结果(如果需要)
import matplotlib.pyplot as plt
from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_test, y_pred)
plt.figure(figsize=(6, 5))
plt.title('Confusion Matrix')
plt.imshow(cm)
plt.colorbar(format='%d')
plt.show()
print("\nROC-AUC Score:", roc_auc_score(y_test, y_proba[:,1]))
说明:
- 数据加载与预处理:代码首先从CSV文件中加载数据集,假设每行有10个数字作为特征(每列对应一个数字0-9),第一列是目标变量。
- 划分训练集和测试集:使用
train_test_split
函数将数据集分成训练集和测试集,以便进行交叉验证。 - 标准化数据:为了确保模型的收敛性,特征通常会被标准化。这里使用了
StandardScaler
。 - 创建随机森林模型:使用
RandomForestClassifier
,这是一个通用的分类模型,适用于中小规模数据集。 - 训练模型:将训练集的特征和标签输入模型,训练模型参数以拟合数据。
- 预测测试集:用训练好的模型对测试集进行预测,并生成概率值(如果需要)。
- 计算评估指标:计算训练准确率、验证准确率以及分类报告。最后还可以通过ROC-AUC评估模型的性能。
输出结果:
- 如果你运行这个代码,你会得到一些具体的数值,比如准确率、召回率和F1分数等,这些都是评估分类模型性能的常用指标。
- 你还能看到混淆矩阵图形,帮助理解模型的预测结果与真实标签之间的关系。
改进方向:
- 如果你有更多的数据,可以增加随机森林的树的数量(
n_estimators
参数),以提高模型性能。 - 你也可以尝试不同的分类算法,比如逻辑回归、SVM或KNN等,比较它们在这个任务上的表现。
希望这段代码能帮助你开始一个机器学习项目!如果有具体的需求,可以告诉我,我会为你提供更针对性的建议。
总结
如果我们想退出的话我们直接就回到我们的启动页面点击关机并且销毁这个实例就行了
到这里我们可以见得我们的deepseek R1模型十分智能,还富有人性化,自此,ai不是高高在上,不再是死板的回答问题,还富有人情味了
DeepSeek 就像 AI 领域的超级引擎,凭借强大的算法和先进的技术架构,以惊人的效率处理各种复杂任务,为我们的科技探索之路照亮前行方向。
如果你也想和我一样使用deepseek的话,你不妨试试 蓝耘智算平台进行deepseek的搭建操作。有了他,你的工作效率肯定会更上一层楼的
蓝耘智算平台注册链接:https://cloud.lanyun.net//#/registerPage?promoterCode=0131