机器学习 - 环境

Conda

安装

linux

1
2
3
4
mkdir -p ~/.miniconda3
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ~/.miniconda3/miniconda.sh
bash ~/.miniconda3/miniconda.sh -b -u -p ~/.miniconda3
rm -rf ~/.miniconda3/miniconda.sh

配置 Shell

1
2
3
4
# for bash
~/.miniconda3/bin/conda init bash
# for zsh
~/.miniconda3/bin/conda init zsh

环境

列出环境

1
$ conda info --envs

创建环境

1
$ conda create -n ml

克隆环境

1
$ conda create --name new_name --clone old_name

启用环境

1
$ conda activate {env-name}

环境重命名

1
conda rename -n old_name new_name 

使用 yml 文件更新环境

1
$ conda env update --file env.yml --prune

删除环境

1
$ conda remove --name {env-name} --all

默认不启用 conda base 环境

1
$ conda config --set auto_activate_base false  # 关闭默认使用 base

为环境添加 channel

1
$ conda config --append channels conda-forge

包管理

conda 的包管理有 channel 的概念,如果不指定则为默认的 defaults。如果我们想要安装其他 channel 的包,示例如下。

1
$ conda install anaconda::gcc_linux-64

查询可用包

1
$ conda search {package}

或在 这里 搜索,页面有安装命令,比如。

1
2
3
$ conda install anaconda::gcc_linux-64
# 另外一个包
$ conda install conda-forge::gcc_linux-64

已安装包

1
$ conda list

移除包

1
$ conda uninstall {package}

安装包

1
2
3
4
5
6
7
8
# 默认包
$ conda install {package}

# 指定channel
$ conda install {channel}::{package}

# 指定版本
$ conda install {package}={version}

Kaggle

安装

详见文档Github 仓库

1
$ pip install kaggle

User Profile 页面 Create New Token,并将下载的文件放到 ~/.kaggle/kaggle.json

vcpkg - 自定义仓库

使用步骤

  • 安装 VCPKG,或更新至最新 VCPKG
  • 创建项目,并使用 vcpkg 管理依赖
  • 使用 vcpkg 打包项目(overlay port)
  • 将项目添加到 Registry

安装 VCPKG

1
2
3
4
# 下载
$ git clone https://github.com/microsoft/vcpkg.git
# 执行依赖检查、下载 vcpkg 可执行文件
$ cd vcpkg && bootstrap-vcpkg.bat

设置环境变量。

1
2
export VCPKG_ROOT="/path/to/vcpkg"
export PATH=$VCPKG_ROOT:$PATH

更新 VCPKG

1
2
3
4
$ cd $VCPKG_ROOT
$ git pull
$ chmod a+x bootstrap-vcpkg.sh
$ ./bootstrap-vcpkg.sh

创建项目

编写工程代码

编写工程源码,以及 CMakeLists.txt 文件。

创建 manifest 文件 vcpkg.jsonvcpkg-configuration.json

1
$ vcpkg new --application

添加 Git Registry 到 vcpkg-configuration.json

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
{
...
"registries": [
{
"kind": "git",
"repository": "https://github.com/Microsoft/vcpkg",
"baseline": "42bb0d9e8d4cf33485afb9ee2229150f79f61a1f",
"packages": "*"
}
]
}
# or
{
...
"registries": [
{
"kind": "git",
"repository": "https://github.com/Microsoft/vcpkg",
"baseline": "42bb0d9e8d4cf33485afb9ee2229150f79f61a1f",
"reference": "master",
"packages": [
"fmt",
"spdlog"
]
}
]
}
  • reference 是可选项,如果你的 commit id 不在默认分支,则必须使用 reference 指定对应的分支,否则会报 failed to unpack tree object

添加依赖包

1
$ vcpkg add port fmt

构建和运行

创建 CMakePresets.json

在项目中创建 CMakePresets.json 文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
{
"version": 2,
"configurePresets": [
{
"name": "default",
"generator": "Ninja",
"binaryDir": "${sourceDir}/vcpkg-build",
"cacheVariables": {
"CMAKE_TOOLCHAIN_FILE": "$env{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake"
}
}
]
}

文件包含一个为 CMake 配置的 default 预定配置(Preset),设置 CMAKE_TOOLCHAIN_FILE 变量,允许 CMake 识别 vcpkg 提供的 C++ 库。

运行 CMake configuration

1
$ cmake --preset=default # 指定预设

构建工程

1
$ cmake --build vcpkg-build

使用 vcpkg 打包库

设置自定义 overlay

在项目目录下,创建 {project}-vcpkg-custome-overlay

1
$ mkdir {project}-vcpkg-custome-overlay

设置 Port 相关文件

vcpkg.json

1
2
$ cd {project}-vcpkg-custome-overlay
$ mkdir {project}-vcpkg-custome-overlay/{project}-library

创建 port 的 vcpkg.json 配置。

1
$ touch {project}-vcpkg-custome-overlay/{project}-library/vcpkg.json
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{
"name": "{project}-library",
"version": "1.0.0",
"homepage": "https://project.com/home",
"description": "project description",
"license": "MIT",
"dependencies": [
{
"name" : "vcpkg-cmake",
"host" : true
},
{
"name" : "vcpkg-cmake-config",
"host" : true
},
"{other-packages}"
]
}

关于 vcpkg.json 更多的说明,参考这里

usage

创建 usage 文件。

1
$ touch {project}-vcpkg-custome-overlay/{project}-library/usage
1
2
3
4
{project}-library provides CMake targets:

find_package({project}_lib CONFIG REQUIRED)
target_link_libraries(main PRIVATE {project}::{project})

关于 usage 文件的更多说明,参考 这里

portfile.cmake

1
$ touch {project}-vcpkg-custome-overlay/{project}-library/portfile.cmake
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
vcpkg_check_linkage(ONLY_STATIC_LIBRARY)

vcpkg_from_github(
OUT_SOURCE_PATH SOURCE_PATH
REPO {user}/{project}
REF "${VERSION}"
SHA512 0 # This is a temporary value. We will modify this value in the next section.
HEAD_REF {project}-lib
)


vcpkg_cmake_configure(
SOURCE_PATH "${SOURCE_PATH}"
)

vcpkg_cmake_install()

vcpkg_cmake_config_fixup(PACKAGE_NAME "{project}_lib")

file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/debug/include")

file(INSTALL "${SOURCE_PATH}/LICENSE" DESTINATION "${CURRENT_PACKAGES_DIR}/share/${PORT}" RENAME copyright)
configure_file("${CMAKE_CURRENT_LIST_DIR}/usage" "${CURRENT_PACKAGES_DIR}/share/${PORT}/usage" COPYONLY)

关于 portfile.cmake 文件的详细说明,参考这里

附,从 gitlab 下载。

1
2
3
4
5
6
vcpkg_from_git(
OUT_SOURCE_PATH SOURCE_PATH
URL git@gitlab.compony.com:group/repo.git
REF {commit-id} # 必须是 commit id
HEAD_REF main
)

更新 portfile.cmake 的 SHA512

第一次运行 vcpkg install ... 获取 SHA512。

1
$ vcpkg install {project}-library --overlay-ports=/path/to/{project}-vcpkg-custom-overlay

在输出中找到如下内容。

1
2
Expected hash: 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Actual hash: 4202125968a01219deeee14b81e1d476dab18d968425ba36d640816b0b3db6168f8ccf4120ba20526e9930c8c7294e64d43900ad2aef9d5f28175210d0c3a417

拷贝 “Actual hash” 的值,覆盖 portfile.cmakeSHA512 的值。

添加编译选项(definitions)

1
2
3
4
vcpkg_cmake_configure(
SOURCE_PATH "${SOURCE_PATH}"
OPTIONS -D...=... -D...=... ...
)

打包安装库

再次运行 vcpkg install ...

1
$ vcpkg install {project}-library --overlay-ports=/path/to/{project}-vcpkg-custom-overlay

注意 依赖要在 {project}-vcpkg-custom-overlay/vcpkg.json 中添加,比如。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
...
"dependencies": [
{
"name": "vcpkg-cmake",
"host": true
},
{
"name": "vcpkg-cmake-config",
"host": true
},
"protobuf"
]
}

再次运行

1
$ vcpkg remove {project}-library # 先移除再重新安装

验证 Port Build

修改代码

复用或新建工程,修改如下内容。

1
2
3
4
5
6
7
# file: {project}/vcpkg.json
{
"dependencies": [
"...",
"{project}-library"
]
}
1
2
3
4
5
6
7
8
9
10
11
12
# file: {project}/vcpkg-configuration.json
{
"default-registry": {
...
},
"registries": [
...
],
"overlay-ports": [
"/path/to/{project}-vcpkg-custom-overlay"
]
}

修改 CMakeLists.txt,添加库依赖。

1
2
3
4
...
find_package({project}_lib CONFIG REQUIRED) # Add this line
add_executable({project} main.cpp)
target_link_libraries({project} PRIVATE {project}_lib::{project}_lib) # Add this line

配置(Configuration)

1
$ cmake --preset=default # 需预先配置 CMakePresets.json, 见上文

构建(Build)

1
$ cmake --build vcpkg-build

运行

1
$ ./vcpkg-build/{project}

创建 Git Registry

1
2
3
4
5
6
$ mkdir ports
$ mkdir versions
$ vim versions/baseline.json
{
"default": {}
}

向 Repository 添加 Port

完整示例,新增依赖库需要修改 / 新增如下文件。

1
2
3
4
5
6
7
8
ports
- {port-name}
- portfile.cmake
- vcpkg.json
versions
- {port-name-first-char}-
- {port-name}.json
- baseline.json

没个仓库都会有 versions/baseline.json 文件,包含在一个特定 commit 的一系列 Ports 的最新版本。

拷贝 Overlay Port 到 Repository(Registry)

拷贝 Overlay Port 到 Repository 的 ports 目录。

1
xcopy <path/to/{project}-library> <ports/{project}-library> /E

Commit

注意,Ports 和 Version 不能同时添加。

Commit Ports

1
2
$ git add ports/<{project}-library>
$ git commit -m '...'

Commit Version

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 更新版本
$ vcpkg --x-builtin-ports-root=./ports --x-builtin-registry-versions-dir=./versions x-add-version --all --verbose --overwrite-version
$ git commit -m '...version'

# 查看帮助
$ vcpkg x-add-version --help

# 跳过格式检查
--skip-formatting-check
--skip-version-format-check

# 格式化
vcpkg format-manifest /path/to/vcpkg.json

# 注: 下面代码仅适用于更新微软 open-source ports,且将 ports 复制到 $VCPKG_ROOT/ports 下
# $ vcpkg x-add-version vcpkg-sample-library

更新 Registry 中已经存在的库版本

  • 从 Registry 拷贝 ports/{library} 到 Custome Overlay 目录
  • 更新版本、portfile.cmake,再走一遍添加 Port 到 Registry 的流程

创建 Port

创建 Helper Ports / Script Ports

Helper Ports / Script Ports 类似于 vcpkg-cmake ,暴露函数以便在构建阶段使用。文档见这里 Author helper portsPort 集成

使用 feature

portfile.cmake

1
2
3
4
5
6
7
8
9
10
11
12
13
vcpkg_check_features(OUT_FEATURE_OPTIONS FEATURE_OPTIONS
FEATURES
asm MI_SEE_ASM
secure MI_SECURE
glog WITH_GLOG
)

vcpkg_cmake_configure(
SOURCE_PATH "${SOURCE_PATH}"
OPTIONS
# Expands to "-DMI_SEE_ASM=ON;-DMI_SECURE=ON;-DWITH_GLOG=ON"
${FEATURE_OPTIONS}
)

vcpkg.json

1
2
3
4
5
6
7
8
9
10
11
{
...
"features": {
"glog": {
"description": "glog",
"dependencies": [
"glog"
]
}
}
}

附录

Trubleshooting

debug/share 目录不存在

原因

没有文件写入到 share 目录(license 文件拷贝貌似不在 debug 拷贝)。

通常,依赖库在 install 时指定 export target,并 install(export target …),会生成对应库的 {lib}Config.cmake ,并拷贝到 share 目录下,示例如下。

1
2
3
4
5
install(TARGETS {lib}
EXPORT {lib}
RUNTIME DESTINATION bin
LIBRARY DESTINATION lib)
install(EXPORT {lib} DESTINATION share/{lib} FILE {lib}Config.cmake)

修复

方案一,手动创建目录,在 portfile.cmake 中添加。

1
file(MAKE_DIRECTORY ${CURRENT_PACKAGES_DIR}/debug/share/{lib})

方案二,依赖库添加 install export

方案三,依赖库添加 install pkgconfig file

failed to unpack tree object

1
2
3
4
5
-- Running vcpkg install
Fetching registry information from https://github.com/sunzhenkai/vcpkg-example-registry (master)...
error: failed to execute: /usr/bin/git --git-dir=/home/wii/.cache/vcpkg/registries/git/.git --work-tree=/home/wii/.cache/vcpkg/registries/git-trees/68d1cfd34c43686c9f60c0d0f780525f29bb046f_3332708.tmp -c core.autocrlf=false read-tree -m -u 68d1cfd34c43686c9f60c0d0f780525f29bb046f
error: git failed with exit code: (128).
fatal: failed to unpack tree object 68d1cfd34c43686c9f60c0d0f780525f29bb046f

原因

git registry 中依赖库的 versions/{x}-/{port}.json 里面的 git-tree 值,是在非默认分支打的,默认克隆 HEAD,或者指定的是默认分支,导致 check out 不出来对应的数据。

解决办法

需要更新 Git Registry 中 port 版本的 git-tree 数据,命令如下。

1
vcpkg --x-builtin-ports-root=./ports --x-builtin-registry-versions-dir=./versions x-add-version --all --verbose --overwrite-version

多编译器

如果系统安装多个版本的 gcc/g++,想使用特定的编译器,可以通过下面命令指定。也可用来解决,多个编译器版本时,不同依赖库使用不同编译器的问题(会有查找编译器程序的差异)。

1
2
export CC=/path/to/gcc
export CXX=/path/to/g++

CMake 工程测试

1
2
3
4
5
$ mkdir build
$ cd build
$ cmake ..
$ make -j
$ cmake --install . --prefix="$PWD" # 安装到当前目录

moviepilot

站点

  • 必须配置一个认证站点

配置认证站点

以 HDFans 为例。

image-20240306194634129

需要设置三个环境变量。

1
2
3
AUTH_SITE=hdfans
HDFANS_UID=...
HDFANS_PASSKEY=...

获取 UID

UID 是数字的用户 ID,点击用户名,跳转到用户信息页面,有 UID 一行。

image-20240306194856879

获取 PASSKEY

image-20240306194948521

一般在站点的设置页面的设置首页,这里的 密钥 就是 PASSKEY。

媒体服务

获取 Plex 的 API 密钥

找到一个媒体,点击这里的更多。

image-20240307102003310

再点击获取信息。

image-20240307102038095

image-20240307102122293

再点击 查看 XML。

image-20240307102705931

在最后有一个 X-Plex-Token,把等号后面的字符串填到 API 密钥那里。

image-20240307102844578

注意

  • MoviePilot 使用三方工具下载内容(比如 Transmission),并通过工具的 API 调用,需要注意的是,下载路径是 MoviePilot 制定的下载路径,如果 Transmission 在另外的容器里面,要确保下载路径在 MoviePilot 和 下载工具的映射是一致的

辅种

MoviePilot 版本 2.1.9-1。辅种原理是,通过种子的 HASH 数据,确认相同的种子,再从其他站点下载种子,只要 HASH 校验通过即可。

  1. 注册 IYUU 获取 Token(微信关注后发送 Token)。
  2. 下载插件 IYUU 站定绑定
    1. 下载后,在已安装点击插件
    2. 输入 IYUU Token,点击保存,关闭插件配置
    3. 再次点击插件,选站点,输入密钥、UID,点击保存
    4. 查看日志校验是否成功,如果不成功可尝试绑定其他站点

![截屏2025-01-08 21.31.55](/2024/03/05/play/server/moviepilot/usage/截屏2025-01-08 21.31.55.png)

  1. 下载插件 IYUU 自动辅种
    1. 启用插件
    2. 输入 IYUU Token
    3. 选择下载器
    4. 选择站点
    5. 保存即可

image-20250108213217556

cmake troubleshoot

Cmake 工程测试不通过

错误信息

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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
Performing C SOURCE FILE Test CMAKE_HAVE_LIBC_PTHREAD failed with the following output:
Change Dir: /tmp/tmp.yyGw1J1RRP/cmake-build-release-devsdksg/CMakeFiles/CMakeScratch/TryCompile-ZS4h4J

Run Build Command(s):/usr/bin/gmake -f Makefile cmTC_48078/fast && /usr/bin/gmake -f CMakeFiles/cmTC_48078.dir/build.make CMakeFiles/cmTC_48078.dir/build
gmake[1]: Entering directory `/tmp/tmp.yyGw1J1RRP/cmake-build-release-devsdksg/CMakeFiles/CMakeScratch/TryCompile-ZS4h4J'
Building C object CMakeFiles/cmTC_48078.dir/src.c.o
/opt/scylladb/bin/gcc -DCMAKE_HAVE_LIBC_PTHREAD -fdiagnostics-color=always -o CMakeFiles/cmTC_48078.dir/src.c.o -c /tmp/tmp.yyGw1J1RRP/cmake-build-release-devsdksg/CMakeFiles/CMakeScratch/TryCompile-ZS4h4J/src.c
Linking C executable cmTC_48078
/data/zhenkai.sun/app/cmake-3.25.1-linux-x86_64/bin/cmake -E cmake_link_script CMakeFiles/cmTC_48078.dir/link.txt --verbose=1
/opt/scylladb/bin/gcc CMakeFiles/cmTC_48078.dir/src.c.o -o cmTC_48078
CMakeFiles/cmTC_48078.dir/src.c.o: In function `main':
src.c:(.text+0x2d): undefined reference to `pthread_create'
src.c:(.text+0x39): undefined reference to `pthread_detach'
src.c:(.text+0x45): undefined reference to `pthread_cancel'
src.c:(.text+0x56): undefined reference to `pthread_join'
collect2: error: ld returned 1 exit status
gmake[1]: *** [cmTC_48078] Error 1
gmake[1]: Leaving directory `/tmp/tmp.yyGw1J1RRP/cmake-build-release-devsdksg/CMakeFiles/CMakeScratch/TryCompile-ZS4h4J'
gmake: *** [cmTC_48078/fast] Error 2


Source file was:
#include <pthread.h>

static void* test_func(void* data)
{
return data;
}

int main(void)
{
pthread_t thread;
pthread_create(&thread, NULL, test_func, NULL);
pthread_detach(thread);
pthread_cancel(thread);
pthread_join(thread, NULL);
pthread_atfork(NULL, NULL, NULL);
pthread_exit(NULL);

return 0;
}

Performing C++ SOURCE FILE Test StdAtomic_EXPLICIT_LINK failed with the following output:
Change Dir: /tmp/tmp.yyGw1J1RRP/cmake-build-release-devsdksg/CMakeFiles/CMakeScratch/TryCompile-pPTD7R

Run Build Command(s):/usr/bin/gmake -f Makefile cmTC_f3ae9/fast && /usr/bin/gmake -f CMakeFiles/cmTC_f3ae9.dir/build.make CMakeFiles/cmTC_f3ae9.dir/build
gmake[1]: Entering directory `/tmp/tmp.yyGw1J1RRP/cmake-build-release-devsdksg/CMakeFiles/CMakeScratch/TryCompile-pPTD7R'
Building CXX object CMakeFiles/cmTC_f3ae9.dir/src.cxx.o
/opt/scylladb/bin/g++ -DStdAtomic_EXPLICIT_LINK -w -g -pthread -fno-omit-frame-pointer -Werror=return-type -fsanitize=address -fdiagnostics-color=always -std=gnu++1z -o CMakeFiles/cmTC_f3ae9.dir/src.cxx.o -c /tmp/tmp.yyGw1J1RRP/cmake-build-release-devsdksg/CMakeFiles/CMakeScratch/TryCompile-pPTD7R/src.cxx
Linking CXX executable cmTC_f3ae9
/data/zhenkai.sun/app/cmake-3.25.1-linux-x86_64/bin/cmake -E cmake_link_script CMakeFiles/cmTC_f3ae9.dir/link.txt --verbose=1
/opt/scylladb/bin/g++ -w -g -pthread -fno-omit-frame-pointer -Werror=return-type -fsanitize=address CMakeFiles/cmTC_f3ae9.dir/src.cxx.o -o cmTC_f3ae9 -latomic
/usr/bin/ld: cannot find /opt/scylladb/lib64/libatomic.so.1.2.0
collect2: error: ld returned 1 exit status
gmake[1]: *** [cmTC_f3ae9] Error 1
gmake[1]: Leaving directory `/tmp/tmp.yyGw1J1RRP/cmake-build-release-devsdksg/CMakeFiles/CMakeScratch/TryCompile-pPTD7R'
gmake: *** [cmTC_f3ae9/fast] Error 2


Source file was:
int main() {}

Performing C++ SOURCE FILE Test StdFilesystem_NO_EXPLICIT_LINK failed with the following output:
Change Dir: /tmp/tmp.yyGw1J1RRP/cmake-build-release-devsdksg/CMakeFiles/CMakeScratch/TryCompile-DLboHE

Run Build Command(s):/usr/bin/gmake -f Makefile cmTC_29ea1/fast && /usr/bin/gmake -f CMakeFiles/cmTC_29ea1.dir/build.make CMakeFiles/cmTC_29ea1.dir/build
gmake[1]: Entering directory `/tmp/tmp.yyGw1J1RRP/cmake-build-release-devsdksg/CMakeFiles/CMakeScratch/TryCompile-DLboHE'
Building CXX object CMakeFiles/cmTC_29ea1.dir/src.cxx.o
/opt/scylladb/bin/g++ -DStdFilesystem_NO_EXPLICIT_LINK -w -g -pthread -fno-omit-frame-pointer -Werror=return-type -std=c++17 -fdiagnostics-color=always -std=gnu++1z -o CMakeFiles/cmTC_29ea1.dir/src.cxx.o -c /tmp/tmp.yyGw1J1RRP/cmake-build-release-devsdksg/CMakeFiles/CMakeScratch/TryCompile-DLboHE/src.cxx
Linking CXX executable cmTC_29ea1
/data/zhenkai.sun/app/cmake-3.25.1-linux-x86_64/bin/cmake -E cmake_link_script CMakeFiles/cmTC_29ea1.dir/link.txt --verbose=1
/opt/scylladb/bin/g++ -w -g -pthread -fno-omit-frame-pointer -Werror=return-type -std=c++17 CMakeFiles/cmTC_29ea1.dir/src.cxx.o -o cmTC_29ea1
CMakeFiles/cmTC_29ea1.dir/src.cxx.o: In function `std::experimental::filesystem::v1::path::path<char [6], std::experimental::filesystem::v1::path>(char const (&) [6])':
/opt/scylladb/include/c++/7/experimental/bits/fs_path.h:198: undefined reference to `std::experimental::filesystem::v1::path::_M_split_cmpts()'
collect2: error: ld returned 1 exit status
gmake[1]: *** [cmTC_29ea1] Error 1
gmake[1]: Leaving directory `/tmp/tmp.yyGw1J1RRP/cmake-build-release-devsdksg/CMakeFiles/CMakeScratch/TryCompile-DLboHE'
gmake: *** [cmTC_29ea1/fast] Error 2

解决方案

ninja-build 版本低

升级 ninja-build 版本,从 1.7.2 升级到 1.11.1 后问题解决。最新版,从这里下载。

使用其他 GCC 库

比如,使用 /opt/scylladb/bin 下的 gcc,需要同步设置 LD_LIBRARY_PATH 和 LIBRARY_PATH。

1
2
3
PATH=/opt/scylladb/bin:$PATH
LD_LIBRARY_PATH=/opt/scylladb/lib64:/opt/scylladb/lib:$LD_LIBRARY_PATH
LIBRARY_PATH=/opt/scylladb/lib64:/opt/scylladb/lib:$LIBRARY_PATH

以免出现以下错误。

1
libstdc++.so.6: version `GLIBCXX_3.4.20' not found

这是因为使用的 g++ 版本和最终链接的 libstdc++ 库不一致导致的。

CMake Error: install(EXPORT “tgt” …) includes target “tgt” which requires target “dep_internal” that is not in any export set

1
2
3
4
add_library(tgt ...)
target_link_libraries(tgt PRIVATE dep_internal)
install(TARGETS tgt EXPORT tgt ...)
install(EXPORT tgt ...)

报错

1
CMake Error: install(EXPORT "tgt" ...) includes target "tgt" which requires target "dep_internal" that is not in any export set

原因

dep_internal 是工程内依赖,且不想安装和 export。在安装和导出 tgt 时,由于依赖项目内定义的库 dep_internal,且是 PRIVATE link,又没有 export,因此出现冲突。

解决

使用 $<BUILD_INTERFACE:{target}>,仅在编译时引用 target。

1
target_link_libraries(tgt PRIVATE $<BUILD_INTERFACE:dep_internal>)

如果被其他库依赖。

1
2
3
4
add_library(tgt ...)
target_link_libraries(tgt PRIVATE dep_internal)
install(TARGETS tgt dep_internal EXPORT tgt ...)
install(EXPORT tgt ...)

Some (but not all) targets in this export set were already defined.

1
2
3
4
5
6
7
8
CMake Error at cmake-build-debug/vcpkg_installed/x64-linux/share/tcmalloc_minimal_static/tcmalloc_minimal_staticConfig.cmake:42 (message):
Some (but not all) targets in this export set were already defined.

Targets Defined: gperftools::spinlock, gperftools::sysinfo,
gperftools::logging

Targets not yet defined: gperftools::tcmalloc_minimal_static,
gperftools::tcmalloc_minimal_internal

一个项目内有多个目标 TargetA 、TargetB。两个目标共同依赖 InternalLibA。

1
2
3
4
5
install(TARGETS TargetA InternalLibA EXPORT TargetA ...)
install(EXPORT TargetA ... NAMESPACE Project)

install(TARGETS TargetB InternalLibA EXPORT TargetB ...)
install(EXPORT TargetB ... NAMESPACE Project)

如上述导入后,如果在其他项目引入。

1
2
3
4
5
find_package(TargetA CONFIG REQUIRED)
target_link_libraries(main PRIVATE Project::TargetA)

find_package(TargetB CONFIG REQUIRED)
target_link_libraries(main PRIVATE Project::TargetB)

则会报如下的错。

1
2
3
4
5
Some (but not all) targets in this export set were already defined.

Targets Defined: Project::InternalLibA

Targets not yet defined: Project::TargetB

原因是在 find_package TargetB 时,出现重复的目标,Project::InternalLibA,在 find_package TargetA 时第一次定义。出现命名冲突。

解决办法,修改 install EXPORT 的 NAMESPACE,避免命名冲突。

1
2
3
4
5
install(TARGETS TargetA InternalLibA EXPORT TargetA ...)
install(EXPORT TargetA ... NAMESPACE TargetA)

install(TARGETS TargetB InternalLibA EXPORT TargetB ...)
install(EXPORT TargetB ... NAMESPACE TargetA)

使用。

1
2
3
4
5
find_package(TargetA CONFIG REQUIRED)
target_link_libraries(main PRIVATE TargetA::TargetA)

find_package(TargetB CONFIG REQUIRED)
target_link_libraries(main PRIVATE TargetB::TargetB)

possibly undefined macro: AC_PROG_LIBTOOL

1
2
3
configure.ac:94: error: possibly undefined macro: AC_PROG_LIBTOOL
If this token and others are legitimate, please use m4_pattern_allow.
See the Autoconf documentation.
1
2
# 安装 libtool
$ yum install libtool

vs code 使用

快捷键

多行编辑

1
2
3
4
5
6
# 选取多行
Option+Shift+{鼠标移动多行}
# 选中文本
选取多行 + Shift + {移动指针}
# 选中文本, 按词移动
选取多行 + Shift + Option + {方向键}

其他

搜索框输入换行

Ctrl + Enter 输入换行

推荐系统 - 模型

推荐系统中的模型

双塔模型

双塔模型(Dual Tower Model)是一种在自然语言处理中用于生成式任务的模型架构。该模型的核心思想是将输入序列分别传递给两个独立的编码器,称为「内容塔」(Content Tower)和「控制塔」(Control Tower),以实现更好的生成效果。

具体来说,双塔模型包含以下几个关键组件:

  1. 内容塔(Content Tower):内容塔负责捕捉输入序列的语义信息和表示。它通常基于预训练的语言模型(如BERT、GPT等)或其他编码器来对输入进行编码,并输出一个表示输入内容的向量序列。
  2. 控制塔(Control Tower):控制塔负责生成输出序列,并指导生成过程。它可以从内容塔的输出中获取输入的语义信息,并根据任务要求生成合适的输出。控制塔可以采用不同的机制,如循环神经网络(RNN)、注意力机制(Attention)等,来实现生成过程。
  3. 连接层(Connector Layer):连接层用于将内容塔的输出和控制塔的输入进行连接,以建立二者之间的联系。可以通过简单的拼接、加权相加等方式实现连接。
  4. 解码器(Decoder):解码器是控制塔的核心组件,用于根据控制塔的输入和先前生成的内容来生成下一个输出。解码器可以基于不同的方法进行设计和训练,以满足特定任务的要求。

使用双塔模型的主要优势在于将表示学习和生成过程分离,充分利用内容塔和控制塔各自的优势。内容塔能够捕捉输入序列的语义信息,而控制塔能够利用这些信息进行更加准确和鲁棒的生成。通过有效地协同工作,双塔模型可以取得较好的生成结果。

需要指出的是,双塔模型的具体实现方式可能因任务需求和研究者的选择而有所差异。该模型的结构和组件可以根据具体情况进行调整和扩展,以适应不同的生成式任务。

适用阶段

  1. 召回
  2. 排序(通常是粗排)