Rust - Usage

内存机制

所有权 (Ownership)

在 Rust 中,内存管理主要通过其独特的所有权(Ownership)系统来实现,配合借用(Borrowing)和生命周期(Lifetimes)规则,在编译期就完成了内存安全的检查和管理。

具体来说,Rust 遵循以下原则:

  • 每个值在 Rust 中都有一个所有者
  • 同一时间只能有一个所有者
  • 当所有者离开作用域时,该值会被自动释放

这种机制让 Rust 无需运行时的垃圾回收器,就能在保证内存安全的同时,获得较高的性能。内存的分配和释放完全由编译器控制,在编译阶段就确定了,不会像 GC 那样在运行时带来额外的性能开销。

拷贝

Rust 不会自动深拷贝数据。如果对象实现了 Copy Trait,那么对该类型的拷贝操作会做简单拷贝,原始变量依旧有效。如果类型包含了实现了 Trop Trait 类型的变量,则该类型不可以被标记为 Copy Trait。

Poetry

说明

Poetry 用于管理 Python 项目信息及依赖。

安装

1
curl -sSL https://install.python-poetry.org | python3 -

Workflow

初始化

1
poetry init

Run

1
poetry run python ...

Activate

1
poetry env activate

Jupyter

部署

Jupyter 的镜像定义在这里,Docker Hub 中的 Jupyter 组织下镜像不再更新。

关于镜像选择,all-spark-notebook 基于 pyspark-notebook 构建。

Docker Compose 部署

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
version: "3.9"

services:
jupyter:
image: quay.io/jupyter/all-spark-notebook:latest
container_name: jupyterlab
restart: unless-stopped
ports:
- "8888:8888"
environment:
- JUPYTER_ENABLE_LAB=yes
- JUPYTER_TOKEN=jupyter
volumes:
- jupyter-data:/home/jovyan/work
volumes:
jupyter-data:

ROOT 权限

1
$ docker exec -it -u root jupyterlab bash # root 用户登录容器,可以在 root 下赋予 jovyan 管理员权限

MinIO

Server

Docker

1
2
3
4
5
6
7
8
9
10
mkdir -p ~/minio/data

docker run \
-p 9000:9000 \
-p 9001:9001 \
--name minio \
-v ~/minio/data:/data \
-e "MINIO_ROOT_USER=ROOTNAME" \
-e "MINIO_ROOT_PASSWORD=CHANGEME123" \
quay.io/minio/minio server /data --console-address ":9001"

Docker Compose

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
version: '3.8'

services:
minio:
image: quay.io/minio/minio
container_name: minio
ports:
- "9000:9000" # API 端口
- "9001:9001" # 控制台端口
environment:
MINIO_ROOT_USER: ROOTNAME
MINIO_ROOT_PASSWORD: CHANGEME123
volumes:
- ~/minio/data:/data
command: server /data --console-address ":9001"

Client

官方文档

Linux

1
2
3
4
5
6
7
# Linux
wget https://dl.min.io/client/mc/release/linux-amd64/mc
chmod +x mc
sudo mv mc /usr/local/bin/mc
# Alias
mc alias set local http://127.0.0.1:9000 {MINIO_ROOT_USER} {MINIO_ROOT_PASSWORD}
mc admin info local

Mac

1
brew install minio/stable/mc

客户端常用命令

官方文档

MetaSpore - 构建

步骤

  • 构建基础镜像(dev / compile 镜像)
  • 训练
    • 构建 Training Build 镜像(打包 MetaSpore Wheel 安装包)
    • 构建 Training Build Release 镜像(训练镜像,包含 Spark 等依赖)
  • 开发
    • 构建 Jupyter 镜像
    • 构建 Code Server 镜像
  • 在线 Serving
    • 构建 Serving Build 镜像(基于 dev 镜像)
    • 构建 Serving Release 镜像(Release 版本的可发布镜像,基于 ubuntu 镜像,安装必要依赖、拷贝 Release 版本二进制文件)

构建

在 Fork 的代码库中新增了 Makefile 用于方便地构建目标、镜像。

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
.PHONY: dev training serving jupyter code-server all

REPOSITORY := sunzhenkai
VERSION := 0.0.1
RUNTIME := cpu
FIX_ARG := --network host --build-arg RUNTIME=$(RUNTIME) --build-arg http_proxy=${http_proxy} --build-arg https_proxy=${https_proxy}
DOCKER_CMD := DOCKER_BUILDKIT=1 docker build $(FIX_ARG)

DEV_IMAGE := $(REPOSITORY)/metaspore-dev-$(RUNTIME):$(VERSION)
TRAINING_BUILD_IMAGE := $(REPOSITORY)/metaspore-training-build:$(VERSION)
TRAINING_RELEASE_IMAGE := $(REPOSITORY)/metaspore-training-release:$(VERSION)
SERVING_BUILD_IMAGE := $(REPOSITORY)/metaspore-serving-build:$(VERSION)
SERVING_RELEASE_IMAGE := $(REPOSITORY)/metaspore-serving-release:$(VERSION)
JUPYTER_IMAGE := $(REPOSITORY)/metaspore-training-jupyter:$(VERSION)
CODESERVER_IMAGE := $(REPOSITORY)/metaspore-codeserver:$(VERSION)

dev:
@$(DOCKER_CMD) $(FIX_ARG) -f docker/ubuntu20.04/Dockerfile_dev -t $(DEV_IMAGE) .

training: dev
@DOCKER_BUILDKIT=1 docker build $(FIX_ARG) -f docker/ubuntu20.04/Dockerfile_training_build --build-arg DEV_IMAGE=$(DEV_IMAGE) -t $(TRAINING_BUILD_IMAGE) .
@DOCKER_BUILDKIT=1 docker build $(FIX_ARG) -f docker/ubuntu20.04/Dockerfile_training_release --build-arg METASPORE_RELEASE=build --build-arg METASPORE_BUILD_IMAGE=$(TRAINING_BUILD_IMAGE) -t $(TRAINING_RELEASE_IMAGE) --target release .

serving: dev
@DOCKER_BUILDKIT=1 docker build $(FIX_ARG) -f docker/ubuntu20.04/Dockerfile_serving_build --build-arg DEV_IMAGE=$(DEV_IMAGE) -t $(SERVING_BUILD_IMAGE) .
@DOCKER_BUILDKIT=1 docker build $(FIX_ARG) -f docker/ubuntu20.04/Dockerfile_serving_release --build-arg BUILD_IMAGE=$(SERVING_BUILD_IMAGE) -t $(SERVING_RELEASE_IMAGE) --target serving_release .

jupyter:
@DOCKER_BUILDKIT=1 docker build $(FIX_ARG) -f docker/ubuntu20.04/Dockerfile_jupyter --build-arg RELEASE_IMAGE=$(TRAINING_RELEASE_IMAGE) -t $(JUPYTER_IMAGE) docker/ubuntu20.04

code-server:
@DOCKER_BUILDKIT=1 docker build $(FIX_ARG) -f docker/ubuntu20.04/Dockerfile_codeserver --build-arg RELEASE_IMAGE=$(TRAINING_RELEASE_IMAGE) -t $(CODESERVER_IMAGE) docker/ubuntu20.04

all: dev training serving jupyter code-server

运行 make all 就可以构建基础镜像、Serving、Training、Jupyter、Code Server 镜像。

ssh

配置

ProxyCommand

1
2
3
4
5
6
7
8
9
Host relay
HostName 192.168.6.5
User wii
IdentityFile ~/.ssh/id_rsa
Host dev
HostName 192.168.6.2
User wii
IdentityFile ~/.ssh/id_rsa
ProxyCommand ssh relay -W %h:%p