小编Gre*_*een的帖子

GUnicorn + CUDA:无法在分叉子进程中重新初始化 CUDA

我正在使用 torch、gunicorn 和 Flask 创建一个应该使用 CUDA 的推理服务。为了减少资源需求,我使用了gunicorn的预加载选项,因此模型在工作进程之间共享。然而,这会导致 CUDA 出现问题。下面的代码片段显示了一个最小的重现示例:

from flask import Flask, request
import torch

app = Flask('dummy')

model = torch.rand(500)
model = model.to('cuda:0')


@app.route('/', methods=['POST'])
def f():
    data = request.get_json()
    x = torch.rand((data['number'], 500))
    x = x.to('cuda:0')
    res = x * model
    return {
        "result": res.sum().item()
    }
Run Code Online (Sandbox Code Playgroud)

使用 启动服务器CUDA_VISIBLE_DEVICES=1 gunicorn -w 3 -b $HOST_IP:8080 --preload run_server:app可以让服务成功启动。然而,一旦执行第一个请求(curl -X POST -d '{"number": 1}'),工作人员就会抛出以下错误:

[2022-06-28 09:42:00,378] ERROR in app: Exception on / [POST]
Traceback (most recent call …
Run Code Online (Sandbox Code Playgroud)

python gunicorn python-multiprocessing pytorch

17
推荐指数
1
解决办法
3万
查看次数

C++17 中 [[nodiscard]] 的解释

在使用 C++20 的项目中,CLion 建议我添加[[nodiscard]]到我的 const 类方法定义中,例如,

class Test {
public:
    [[nodiscard]] int f(int a, int b) const {
        return a + b;
    }
}
Run Code Online (Sandbox Code Playgroud)

解释是

向成员函数添加 [[nodiscard]] 属性(在 C++17 中引入),以便在编译时突出显示哪些返回值不应被忽略。

我还检查了cppreference.com

如果从废弃值表达式(而不是强制转换为 void)调用声明为 nodiscard 的函数或按值返回声明为 nodiscard 的枚举或类的函数,则鼓励编译器发出警告。... 出现在函数声明、枚举声明或类声明中。

如果从丢弃值表达式而不是强制转换为 void,

  • 调用声明为 nodiscard 的函数,或者
  • 调用返回按值声明为 nodiscard 的枚举或类的函数,或者
  • 通过显式类型转换或 static_cast 调用声明为 nodiscard 的构造函数,或者
  • 声明为 nodiscard 的枚举或类类型的对象通过显式类型转换或 static_cast 进行初始化,

鼓励编译器发出警告。

老实说,我不太明白为什么这个位置需要这个注释。如果调用者进一步处理它们,为什么编译器会忽略我的返回值?是否有一个直观的解释来解释它到底告诉编译器什么以及为什么需要它?

c++ compiler-warnings c++17 nodiscard c++-attributes

14
推荐指数
2
解决办法
9012
查看次数

Springboot:更好地处理错误消息

我正在使用 Spring Boot 开发一个 API,目前我正在考虑如何以一种易于国际化的方式处理错误消息。我的目标如下:

  1. 在资源文件/包中定义错误消息
  2. @Length以声明方式将约束注释与错误消息(例如,)连接起来
  3. 错误消息包含占位符,例如{min},它们被注释中的相应值替换(如果可用),例如,@Length(min = 5, message = msg)将导致类似 的结果msg.replace("{min}", annotation.min()).replace("{max}", annotation.max())
  4. JSON 属性路径也可用作占位符,并在发生验证错误时自动插入到错误消息中。
  5. 错误处理程序之外的解决方案是首选,即,当异常到达错误处理程序时,它们已经包含所需的错误消息。
  6. 来自资源包的错误消息会自动注册为 Java 中的常量。

目前,我自定义了methodArgumentNotValidHandler错误处理程序类的读取内容ObjectErrore.getBindingResult().getAllErrors()然后尝试提取它们的参数和错误代码,以决定从资源包中选择哪个错误消息并相应地对其进行格式化。我的代码的粗略草图如下所示:

输入:

@Data
@RequiredArgsConstructor
public class RequestBody {
  @NotNull
  @NotBlank(message = ErrorConstants.NOT_BLANK)
  @Length(min = 5, max = 255, message = ErrorConstants.LENGTH_MIN_MAX) // LENGTH_MIN_MAX = validation.length.min-max
  private String greeting;
}
Run Code Online (Sandbox Code Playgroud)

错误处理程序:

@ResponseBody
@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
ErrorMessage methodArgumentNotValidHandler(MethodArgumentNotValidException e) {
  ObjectError objectError = e.getBindingResult().getAllErrors().get(0);
  Object[] arguments = objectError.getArguments(); …
Run Code Online (Sandbox Code Playgroud)

java validation error-handling spring-boot

9
推荐指数
1
解决办法
1万
查看次数

Rust:区分fs::remove_file错误处理中的几种情况

在 Rust 中,我想删除一个文件。文档告诉我,fs::remove_file如果文件是目录、不存在或用户缺乏该操作的权限,则会返回错误。

现在,在我的场景中,我想区分这三种情况。但是,我的调试器不会显示错误的类型,println!结果只是打印错误消息。

那么,我如何区分这些情况呢?

use std::fs;

fn rem(path: &str) {
  let msg = match fs::remove_file(path) {
    Ok(()) => "is fine",
    Err(NotExist) => "does not exist", // TODO: Pattern
    Err(IsDir) => "is a directory", // TODO: Pattern
    Err(_) => "is not yours",
  };  
  println!("The file {}!", msg);
}

fn main() {
  rem("/tmp/this-file-hopefully-not-exists.xyz"); // print "not exist"
  rem("/tmp/this-is-a-directory"); // prints "is a directory"
  rem("/tmp/this-file-belongs-to-root.xyz"); // prints "is not yours"
}
Run Code Online (Sandbox Code Playgroud)

error-handling pattern-matching rust

6
推荐指数
1
解决办法
793
查看次数

Bash:从每行提取多个条目

我有一个日志文件,看起来有点像这样grep my_function $LOG_FILE

[0] my_function took 96.78581194020808 ms
[1] my_function took 82.0779490750283 ms
[2] my_function took 187.79653799720109 ms
[1] my_function took 98.69955899193883 ms
[0] my_function took 10.296131949871778 ms[1] my_function took 2.5152561720460653 ms
[1] my_function took 2.210912061855197 ms
[2] my_function took 3.418975044041872 ms
Run Code Online (Sandbox Code Playgroud)

从这个文件中,我只想提取每行中的数字。通常,我会这样做awk '{print $4}',但此日志包含几行和两个条目。但是,在这里,我有时需要从一行中选择两个单独的条目。我如何使用bash/GNU 工具适当地选择这些?

awk gnu unix-text-processing

6
推荐指数
2
解决办法
186
查看次数

带按钮的AngularJS ng-repeat列表:单击后禁用按钮

我在AngularJS中有一个包含多个条目的列表,每个条目都有一个按钮.单击按钮时,应用程序将执行一些操作,然后成功完成后,应禁用该按钮.

我模板中有趣的部分如下所示:

<li ng-repeat="item in items">
  <span>{{item}}</span>
  <button ng-click="doSomeStuff(item)">Request</button>
</li>
Run Code Online (Sandbox Code Playgroud)

我已经尝试使用ng-if指令,但当然每个按钮都会消失.

以前,我考虑过使用原始Javascript或jQuery的解决方案,因为只需通过其id修改按钮就很容易了.但AngularJS是否提供了解决方案?

list button angularjs

5
推荐指数
1
解决办法
6109
查看次数

SSD 与 tmpfs 速度

tmpfs使用以下命令在 Ubuntu 上的主目录中创建了一个文件系统:

$ mount -t tmpfs -o size=1G,nr_inodes=10k,mode=0777 tmpfs space
$ df -h space .
File system                  Size    Used Avail. Avail% Mounted at
tmpfs                        1,0G    100M  925M   10%   /home/user/space
/dev/mapper/ubuntu--vg-root  914G    373G  495G   43%   /
Run Code Online (Sandbox Code Playgroud)

然后我写了这个Python程序:

#!/usr/bin/env python3

import time
import pickle


def f(fn):
    start = time.time()
    with open(fn, "rb") as fh:
        data = pickle.load(fh)
    end = time.time()
    print(str(end - start) + "s")
    return data


obj = list(map(str, range(10 * 1024 * 1024)))  # approx. 100M


def …
Run Code Online (Sandbox Code Playgroud)

python linux performance solid-state-drive tmpfs

5
推荐指数
1
解决办法
2342
查看次数

通过 ssh 传输参数时避免字符串拆分

为了启动分布式计算,我编写了一个运行脚本,用于ssh登录远程计算机并启动从标准输入读取的脚本。但是,此运行脚本需要将用户提供的参数正确传输$@到远程计算机。但是,我注意到参数没有正确传输。

比方说,task.sh远程计算机应该执行的脚本是

i=0
for p in "$@"; do
  echo "#${i}: ${p}"
  i=$((i+1))
done
Run Code Online (Sandbox Code Playgroud)

该脚本只是迭代参数并逐行打印它们,例如,

$ bash task.sh hello world 'in one line'
#0: hello
#1: world
#2: in one line
Run Code Online (Sandbox Code Playgroud)

我的简化运行脚本run.sh现在如下所示:

ssh user@remote.example.com "bash -s $@" < task.sh
Run Code Online (Sandbox Code Playgroud)

但是,这将打印:

$ bash run.sh hello world 'in one line'
#0: hello
#1: world
#2: in
#3: one
#4: line
Run Code Online (Sandbox Code Playgroud)

当我$@', ie引用时

ssh user@remote.example.com "bash -s '$@'" < task.sh
Run Code Online (Sandbox Code Playgroud)

打印以下内容:

$ …
Run Code Online (Sandbox Code Playgroud)

linux ssh bash shell

4
推荐指数
1
解决办法
79
查看次数

为什么在循环条件下使用 != 来比较迭代器

在许多有关迭代向量的示例中,我注意到通常使用不等于运算符来检查循环是否已到达向量的末尾。通常,我在循环条件中使用小于运算符。因此,我想知道,选择的理由是什么!=

例子:

std::vector<int> vec = {1, 2, 3, 4, 5};
for (auto iter = vec.begin(); iter != vec.end(); iter++) {
  std::cout << *iter << " ";
}
Run Code Online (Sandbox Code Playgroud)

c++ iterator loops

2
推荐指数
1
解决办法
271
查看次数

SpringBoot:拦截器的 preHandle 在流端点上运行两次

我想使用拦截器来管理当前与服务器的活动连接数。除了常见的 JSON 端点之外,我的 API 还提供流字节的端点。我实现了一个会话管理器,用于跟踪会话计数、一个限制拦截器和几个 API 端点。下面是一些示例代码。

常见的 JSON 端点与拦截器运行良好。然而,流端点实际上调用了拦截器的preHandle方法两次,但afterCompletion只调用了一次。第二次调用preHandle发生在第一个调用的响应计算完成之后。当我从拦截器中删除会话管理器时,这种行为不再发生。

最小工作示例:

配置:

@Configuration
@RequiredArgsConstructor
public class AppConfig implements WebMvcConfigurer {
    private final Interceptor interceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(this.interceptor).addPathPatterns("/numbers", "/numbers/*");
    }
}
Run Code Online (Sandbox Code Playgroud)

拦截器:

@Component
@RequiredArgsConstructor
@Slf4j
public class Interceptor implements HandlerInterceptor {
    private final SessionManager sessionManager;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        log.info("Pre-handle {}", this.hashCode());
        return this.sessionManager.accept();
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception …
Run Code Online (Sandbox Code Playgroud)

java streaming spring spring-mvc interceptor

0
推荐指数
1
解决办法
1556
查看次数