所有文章¶
Docker 中的 CMD 和 ENTRYPOINT
Docker 中的 CMD 和 ENTRYPOINT 都是用来指定容器启动时执行的命令,但它们的作用和使用场景有明显区别,理解它们的区别能帮助我们更灵活地控制容器行为。
CMD 和 ENTRYPOINT 的通俗理解
- ENTRYPOINT:就像容器的“主菜”,是容器启动时必须执行的命令,无论启动容器时传入什么参数,这个命令都会执行。可以把它想象成披萨店的“披萨”,披萨是必做的主食。
-
CMD:就像披萨的“默认口味”,是容器启动时的默认参数或命令,如果启动容器时没有指定其他命令,CMD 会生效;如果指定了其他命令,CMD 会被覆盖。它是给 ENTRYPOINT 提供默认参数,或者单独作为默认命令使用。
-
如果只有 CMD,启动容器时指定的命令会替代 CMD。
- 如果只有 ENTRYPOINT,启动容器时的参数会附加到 ENTRYPOINT 命令后面。
- 如果两者结合,ENTRYPOINT 定义主命令,CMD 定义默认参数,启动时可以覆盖 CMD 参数但不会替换 ENTRYPOINT。
国内服务器安装 Dokploy
使用国内服务器安装 Dokploy 时,可能由于网络问题无法顺利下载某些 Docker 镜像而卡住。本文记录了修改 install.sh
并成功在一台国内服务器上安装 Dokploy 的过程。
pandas rolling exponential 滚动计算指数加权标准差会受起点影响
在使用 rolling(win_type="exponential").std()
计算标准差时,结果可能会受数据起点的影响。
本文将通过几个简单的代码示例,探究数据具有不同数据起点(通过 iloc[1:]
手动构造不同的数据起点进行模拟)对 Pandas rolling(win_type="exponential").std()
计算结果的影响,并提供了一个自定义函数实现严格控制滚动回看窗口,以获得一致的结果。
学习 Rust
最近学习了 Rust。一直听说 Rust 效率高,从ruff
和 uv
这两个基于 Rust 实现的工具开始对 Rust 印象深刻,自己亲身体会过它的语法细节之后,对它为什么快、为什么“安全”,总算有了一点理解。
推荐一下 rustlings
这个学习 Rust 的项目。每个文件就是解决一个小问题,这种在小练习中修改代码的过程比从头到尾读教程要有趣和有成就感得多。结合《Rust 语言圣经》这个优秀的教程食用,效果甚佳。
ConcatDataset 和 StackDataset
在 PyTorch 中,ConcatDataset
和 StackDataset
是两种不同的数据集组合方式。本文介绍了它们的作用及其适用场景。
## 使用 ConcatDataset 连接数据集
concat_dataset = ConcatDataset([dataset1, dataset2])
## 遍历 ConcatDataset
for sample in concat_dataset:
print(sample)
## 使用 StackDataset 组合数据集
stack_dataset = StackDataset(dataset1, dataset2)
## 遍历 StackDataset
for sample in stack_dataset:
print(sample)
Layer Normalization
本文用一个简单的数值例子,说明了 LayerNorm 的作用。
借助 torchmetrics
的 CompositionalMetric
将越大越好的指标作为损失函数
在量化研究中,我们可以使用诸如 IC
一类的指标来衡量信号的质量。若将 IC
作为损失函数,我们自然是希望其值越大越好。但是,模型的优化过程总是朝着损失函数越小的方向进行的,因此我们需要将 IC
取反后作为损失值,使得模型朝着 IC
越大的方向优化。
本文介绍了一个便捷的方法,借助 torchmetrics
的 CompositionalMetric
将越大越好的指标作为损失函数。
pred = torch.tensor([1, 2, 3, 4]).to(torch.float32)
target = torch.tensor([2, 3, 5, 10]).to(torch.float32)
print("原始相关系数:", np.corrcoef(target, pred)[0, 1])
loss_fn = 0 - PearsonCorrCoef()
print("损失函数:", loss_fn(pred, target))