Fork me on GitHub

免费服务器的选择

深度学习模型的训练和部署通常需要强大的计算资源,尤其是GPU加速。对于个人用户或小型项目来说,购买高性能服务器可能成本较高,因此选择免费的服务器资源成为一个不错的选择。以下是我用过的一些免费服务器选项:

1. 启智协作平台

启智协作平台 是一个提供免费GPU、NPU等计算资源的平台。平台支持多种深度学习框架,如TensorFlow和PyTorch。注册后,用户可以获得50个积分的免费额度,用于租用如GPU、NPU等计算资源。

1.1 创建任务

首先先需要创建数据集和项目,然后才能创建云脑任务。创建数据集和项目流程略。

创建数据集示例

任务主要分为四种类型:

  • 调试任务(最多运行4小时)
  • 训练任务(适合长期训练,但不会返回运行时出现的错误)
  • 推理任务
  • 通用任务(需要审批)

下面以训练任务为例介绍如何创建任务:

训练任务

基本信息这边根据个人情况选择即可,建议选择NPU,不仅显存、内存、CPU核数比传统GPU高,并且消耗积分也更少。

镜像的话可以选择一个别人用的镜像(最好带cann),也可以把自己调试任务的环境保存成镜像。启动文件的话选择自己训练主程序入口(路径不要带点,如./examples/myexp_NPU.py,否则运行出错)。

1.2 tricks

  • 每天可以通过创建数据集、创建项目仓库等方式获取积分。
  • 还可以通过每日运行一次任务获得10个积分。
  • 任务终止后只有 work 路径下的文件会被保存,其他路径下的文件还有已经配好的环境都会丢失,建议把结果保存到 work 路径下,并且在主程序里添加pip下载依赖的代码。
1
2
import os
os.system('pip install numpy hickle lightning torch==2.1.0 torchvision xarray fvcore lpips pandas scikit-image timm tqdm einops PyWavelets')
  • 如果检测不到 NPU,可以在终端输入以下命令:
1
source /usr/local/Ascend/ascend-toolkit/set_env.sh
  • GPU 训练的代码可以通过torch_npu框架的代码转换直接在 NPU 上运行,代码转换代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
try:
import torch_npu
from torch_npu.contrib import transfer_to_npu

# 1. 修复 get_device_capability 返回 None 的问题
# NPU 不支持这个概念,我们伪造一个返回值 (比如 8.0,代表 Ampere 架构,骗过 Lightning)
if not hasattr(torch.cuda, 'get_device_capability'):
torch.cuda.get_device_capability = lambda device=None: (8, 0)
else:
# 如果已经存在但返回 None (transfer_to_npu 的副作用),则覆盖它
original_get_cap = torch.cuda.get_device_capability
def patched_get_cap(device=None):
cap = original_get_cap(device)
if cap is None:
return (8, 0) # 伪造一个支持 TF32 的架构
return cap
torch.cuda.get_device_capability = patched_get_cap
print("Info: 成功启用 NPU 自动迁移 (transfer_to_npu)。")
# 2. 禁用 Lightning 的 TF32 精度检查 (NPU 不需要这个)
torch.set_float32_matmul_precision('medium')
except ImportError:
print("Info: 未检测到 torch_npu,将使用标准 CPU/GPU 模式。")

2. Kaggle

Kaggle 是一个数据科学竞赛平台,提供免费的GPU资源(NVIDIA Tesla P100)。用户可以创建Notebook并使用这些资源进行深度学习模型的训练和测试。Kaggle 每周提供30小时的GPU使用时间,适合中小型项目,且使用方便。

2.1 创建Notebook

在Kaggle主页,点击右上角的“New Notebook”按钮,选择“Notebook”选项。然后在Notebook界面,点击右侧的“Settings”图标,选择“Accelerator”为GPU。注意需要手机验证后才能使用GPU资源。

2.2 tricks

  • Kaggle的GPU资源是按周计算的,每周六重置30小时的使用时间。
  • 需要预先把数据上传到 input 里面,模型默认保存在 output 路径下
  • 如果在本地已经写好了训练代码,可以先上传到input,通过以下代码拷贝到工作区
1
2
3
4
5
6
7
import shutil

src_dir = '/kaggle/input/openstl-hycom-code'
dst_dir = '/kaggle/working/openstl-hycom-code'

# 如果目标文件夹已存在,需先删除或用 dirs_exist_ok=True(Python 3.8+)
shutil.copytree(src_dir, dst_dir, dirs_exist_ok=True)
  • 通过下面这个魔术命令可以修改在 kaggle路径下的代码内容:
1
2
3
4
%%writefile /kaggle/working/path/to/yourcode/myexp.py

import os
# ..new code..
  • Notebook中代码在docker容器中运行,每次运行前都需要配置环境,配置环境代码如下所示:
1
2
3
# 在训练代码入口添加
import os
os.system('pip install numpy')
  • Notebook运行结束后,可以从 output 路径下下载所需模型文件
  • 默认工作路径 /kaggle/working 限制大小为20G,可以考虑把模型工作路径迁移到 /kaggle/tmp 文件夹下:
1
2
3
# notebook的魔术命令
!mkdir /kaggle/tmp
%cd /kaggle/tmp
  • 可以把模型和训练日志等上传到模型托管平台(如huggingface(可免费存100G)),上传代码如下所示:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
class HuggingFaceSyncCallback(Callback):
def __init__(self, repo_id, token, src_dir, log_dir):
super().__init__()
self.repo_id = repo_id
self.token = token
self.src_dir = src_dir
self.log_dir = log_dir
self.api = HfApi(token=token)
self.current_epoch = 0

def on_train_epoch_end(self, trainer, pl_module):
self.current_epoch = trainer.current_epoch
self._upload()

def _upload(self):
try:
# 上传整个 checkpoints 文件夹
self.api.upload_large_folder(
folder_path=self.src_dir,
repo_id=self.repo_id,
repo_type="model",
# path_in_repo="checkpoints", # 在仓库中的路径
# commit_message=f"Upload checkpoints epoch {self.current_epoch}",
num_workers=4, # 并发上传数
print_report=True,
print_report_every=60, # 每60秒打印进度
)

self.api.upload_folder(
folder_path=self.log_dir,
repo_id=self.repo_id,
repo_type="model",
path_in_repo="lightning_logs", # 在仓库中的路径
commit_message=f"Upload logs epoch {self.current_epoch}"
)
print("Successfully uploaded checkpoints to HuggingFace Hub")
except Exception as e:
print(f"Upload failed: {e}")
  • 可以从huggingface下载最新的checkpoint再次训练,代码如下:
1
2
3
4
5
6
7
8
from huggingface_hub import hf_hub_download

# 下载 last.ckpt 到本地
model_path = hf_hub_download(
repo_id="marinerubbish/openstl-hycom-model",
filename="./last.ckpt",
local_dir="." # 下载到哪个文件夹
)

第4节-数据类型

1. 数值类型

整形分为 TINYINTSMALLINTMEDIUMINTINTBIGINT 四种类型,
大小分别为 1-4byte 和 8byte。

浮点型分为 FLOATDOUBLEDECIMAL。前两种大小与C语言的float和double相同。
DECIMAL 大小由长度M(精度) 和 小数点后位数d(标度) 决定。

比如要存储分数字段,因为最高分为100.0,有四位数、一位小数。
因此用 DECIMAL(4,1) 作为其数据类型。

2. 字符串类型

第3节-表的创建和查询

1. 查询表

查询 sys 数据库里的表:

1
2
USE sys;
SHOW TABLES;

1
2
3
4
5
6
7
8
9
10
11
12
+-----------------------------------------------+
| Tables_in_sys |
+-----------------------------------------------+
| host_summary |
| host_summary_by_file_io |
| host_summary_by_file_io_type |
| host_summary_by_stages |
| host_summary_by_statement_latency |
| ... |
| x$waits_global_by_latency |
+-----------------------------------------------+
101 rows in set (0.03 sec)

2. 创建表

创建一个名为 user_db 的数据库,并且使用:

1
2
CREATE DATABASE IF NOT EXISTS user_db;
USE user_db;

user_db 里创建一个表:

标准形式

1
2
3
4
5
6
7
CREATE TABLE 表名(
字段1 字段1类型 [COMMENT 字段1注释],
字段2 字段2类型 [COMMENT 字段2注释],
字段3 字段3类型 [COMMENT 字段3注释],
...
字段n 字段n类型 [COMMENT 字段n注释]
)[ COMMENT 表注释 ];

实际语句

1
2
3
4
5
6
CREATE TABLE table1(
-> id int COMMENT "编号",
-> name varchar(50) COMMENT "姓名",
-> age int COMMENT "年龄",
-> gender varchar(1) COMMENT "性别"
-> )COMMENT "用户表";

正常结果

1
Query OK, 0 rows affected (0.07 sec)

3. 查询表结构

1
DESC table1;
1
2
3
4
5
6
7
8
9
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id | int | YES | | NULL | |
| name | varchar(50) | YES | | NULL | |
| age | int | YES | | NULL | |
| gender | varchar(1) | YES | | NULL | |
+--------+-------------+------+-----+---------+-------+
4 rows in set (0.01 sec)

4. 查询创建表的语句

1
SHOW CREATE TABLE table1;
1
2
3
4
5
6
7
8
9
10
11
+--------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+--------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| table1 | CREATE TABLE `table1` (
`id` int DEFAULT NULL COMMENT '编号',
`name` varchar(50) DEFAULT NULL COMMENT '姓名',
`age` int DEFAULT NULL COMMENT '年龄',
`gender` varchar(1) DEFAULT NULL COMMENT '性别'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='用户表' |
+--------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)

Reference

  1. MySQL学习笔记
  2. 黑马程序员 MySQL数据库入门到精通

第2节 数据库操作

0. SQL通用语法分类

  • DDL: 数据定义语言,用来定义数据库对象(数据库、表、字段)
  • DML: 数据操作语言,用来对数据库表中的数据进行增删改
  • DQL: 数据查询语言,用来查询数据库中表的记录
  • DCL: 数据控制语言,用来创建数据库用户、控制数据库的控制权限

1. 查询所有数据库

1
SHOW DATABASES;
1
2
3
4
5
6
7
8
9
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.02 sec)

2. 创建数据库

如果 mydb 数据库不存在,就创建一个名为 mydb 的数据库。

字符集指定为 utf8mb4,排序方式指定为 utf8mb4_general_ci

1
CREATE DATABASE IF NOT EXISTS mydb DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_general_ci;

1
Query OK, 1 row affected (0.07 sec)

通过 SHOW COLLATION; 命令可以查询MySQL支持的所有排序规则

1
2
3
4
5
6
7
8
9
10
11
12
+-----------------------------+----------+-----+---------+----------+---------+---------------+
| Collation | Charset | Id | Default | Compiled | Sortlen | Pad_attribute |
+-----------------------------+----------+-----+---------+----------+---------+---------------+
| armscii8_bin | armscii8 | 64 | | Yes | 1 | PAD SPACE |
| armscii8_general_ci | armscii8 | 32 | Yes | Yes | 1 | PAD SPACE |
| ascii_bin | ascii | 65 | | Yes | 1 | PAD SPACE |
| ascii_general_ci | ascii | 11 | Yes | Yes | 1 | PAD SPACE |
| big5_bin | big5 | 84 | | Yes | 1 | PAD SPACE |
| ... |
| utf8mb4_zh_0900_as_cs | utf8mb4 | 308 | | Yes | 0 | NO PAD |
+-----------------------------+----------+-----+---------+----------+---------+---------------+
286 rows in set (0.02 sec)

3. 使用数据库

1
USE mydb;
1
Database changed

4. 查询当前数据库

1
SELECT DATABASE();
1
2
3
4
5
6
+------------+
| DATABASE() |
+------------+
| mydb |
+------------+
1 row in set (0.00 sec)

5. 删除数据库

删除之前执行 SHOW DATABASES 命令的结果:

1
2
3
4
5
6
7
8
9
10
+--------------------+
| Database |
+--------------------+
| information_schema |
| mydb |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.04 sec)

删除命令
1
DROP DATABASE IF EXISTS mydb;

删除后的结果:

1
Query OK, 0 rows affected (0.07 sec)

删除后再执行 SHOW DATABASES 命令的结果:

1
2
3
4
5
6
7
8
9
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)

Reference

  1. MySQL学习笔记
  2. 黑马程序员 MySQL数据库入门到精通

第1节 Linux下MySQL Workbench环境配置

0. 前置内容

  1. 上一节文章地址: https://marine-rubbish.github.io/2024/06/09/MySQL%E5%AD%A6%E4%B9%A0/%E7%AC%AC0%E8%8A%82-Linux%E4%B8%8BMySQL%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE/
  2. 本来想配置 MySQL Administrator 和 MySQL Query Browser 的。但是据说过时了,于是配 Workbench 。

1. 安装 (Unfinished)

访问安装包下载地址: https://dev.mysql.com/downloads/workbench/

这里选择下载Ubuntu 23.10版本的:
Workbench 官网

通过 dpkg 命令下载 .deb 安装包:

1
sudo dpkg -i ~/下载/mysql-workbench-community_8.0.36-1ubuntu23.10_amd64.deb

如果中间有依赖报错,可以用以下命令安装依赖:

1
sudo apt -f install # -f 参数代表 --fix-broken,尝试修复依赖导致的问题

因为Ubuntu版本太新了,没有对应24.04版本的workbench,只能咕咕咕了。

2. 使用 (Unfinished)

第0节 Linux下MySQL环境配置

0. 前言

作者采用的Linux为Ubuntu 24.04版。

1. Linux下MySQL安装

可以先用rpm命令检查是否已经安装MySQL:

1
rpm -qa | grep mysql

如果没有安装的话可以采用apt安装:

1
sudo apt install mysql-server

安装完成后可以用以下命令验证是否安装成功

1
2
mysql --version 
# mysql Ver 8.0.36-2ubuntu3 for Linux on x86_64 ((Ubuntu))

启动MySQL并查看MySQL状态:

1
2
3
systemctl start mysql
systemctl enable mariadb # 设置开机启动
systemctl status mysql

2. 配置MySQL

mysql8.0,root 用户默认通过 auth_socket 插件授权,而 auth_socket 插件通过 Unix socket 文件来验证所有连接到 localhost 的用户。

这意味着身份验证是基于操作系统用户的,而不是基于用户密码的,你不能以用户–密码的方式,登录root账户。

通过指令以root身份登录:

1
sudo mysql

修改MySQL数据库底下的user表,配置密码方式以root身份登录:

1
2
use mysql; -- 使用mysql数据库
select user, host, plugin from user; -- 从user中选择user、host、plugin 这三列

正常的输出结果为:

1
2
3
4
5
6
7
8
9
10
+------------------+-----------+-----------------------+
| user | host | plugin |
+------------------+-----------+-----------------------+
| debian-sys-maint | localhost | caching_sha2_password |
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session | localhost | caching_sha2_password |
| mysql.sys | localhost | caching_sha2_password |
| root | localhost | auth_socket |
+------------------+-----------+-----------------------+
5 rows in set (0.00 sec)

其中 user 列代表用户名、 host 列代表用户可以从哪些主机连接到数据库服务器、 plugin 代表用于该用户认证的插件

root 对应的plugin由 auth_socket 改为 mysql_native_password

1
2
alter user 'root'@'localhost' identified with mysql_native_password by '密码';
flush privileges; -- 重新加载权限表

再次从user中选择user、host、plugin 这三列,发现最后一行plugin变成 mysql_native_password 就成功了:

1
2
3
4
5
6
7
8
9
10
+------------------+-----------+-----------------------+
| user | host | plugin |
+------------------+-----------+-----------------------+
| debian-sys-maint | localhost | caching_sha2_password |
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session | localhost | caching_sha2_password |
| mysql.sys | localhost | caching_sha2_password |
| root | localhost | mysql_native_password |
+------------------+-----------+-----------------------+
5 rows in set (0.00 sec)

退出后可以通过密码的方式登录数据库:

1
exit; -- 退出

1
mysql -uroot -p # 以root身份用密码登录mysql

Reference

  1. https://blog.csdn.net/LogosTR_/article/details/125602116
  2. https://www.runoob.com/mysql/mysql-install.html

Chap2

1. 作业答案

Q1: 阅读 man ls ,然后使用ls 命令进行如下操作:

  • 列出所有文件信息:-l
  • 所有文件(包括隐藏文件) :-a
  • 文件打印以人类可以理解的格式输出 (例如,使用454M 而不是 454279954) : -h
  • 文件以最近访问顺序排序:-t
  • 以彩色文本显示输出结果:—color=auto

典型输出如下:

1
2
3
4
5
-rw-r--r--   1 user group 1.1M Jan 14 09:53 baz
drwxr-xr-x 5 user group 160 Jan 14 09:53 .
-rw-r--r-- 1 user group 514 Jan 14 06:42 bar
-rw-r--r-- 1 user group 106M Jan 13 12:12 foo
drwx------+ 47 user group 1.5K Jan 12 18:08 ..

A:

1
ls -lhat --color=auto

Q2: 编写两个bash函数 marco 和 polo 执行下面的操作。每当你执行 marco 时,当前的工作目录应当以某种形式保存,当执行 polo 时,无论现在处在什么目录下,都应当 cd 回到当时执行 marco 的目录。为了方便debug,你可以把代码写在单独的文件 marco.sh 中,并通过 source marco.sh命令,(重新)加载函数。

A:

  • Copyrights © 2022-2026 CPY
  • Visitors: | Views:

请我喝杯咖啡吧~

支付宝
微信