异步调用cuda()会导致SyntaxError

时间:2018-11-08 04:23:21

标签: python pytorch

我正在尝试运行以下PyTorch代码:

<?php
$number = "555-555-5555 x 230";

preg_match_all('!\d+!', $number, $matches);

for($x=0;$x<count($matches);$x++){

        for($y=0;$y<count($matches[$x]);$y++){
            if($y == (count($matches[$x]) - 1)){
                    $result[]= "#".$matches[$x][$y];
                }else{
                    $result[] = $matches[$x][$y];
                }
        }
}

    for($xy=0;$xy<count($result);$xy++){

        if($xy == count($result) - 1 ){
            $data['ext'][] = $result[$xy];
        }else{
            $data['number'][] = $result[$xy];
        }

    }

    $num = implode("-", $data['number']);
    $ext = implode("", str_replace("#","",$data['ext']));

    $final = array("number" => $num, "ext" => $ext);
    echo "<pre>";print_r($final);

?>

但是当我尝试时,我收到此错误消息:

for i, (input, target) in enumerate(train_loader):

    input = input.float().cuda(async=True)
    target = target.cuda(async=True)
    input_var = torch.autograd.Variable(input)
    target_var = torch.autograd.Variable(target)

    output = model(input_var)

我在做什么错?我已经安装了cuda。

2 个答案:

答案 0 :(得分:2)

您的代码不起作用,原因是:

  • async是python中的保留关键字,不能以这种方式使用,这就是为什么您获得SyntaxError

  • 的原因
  • cuda()本身也没有参数async。构造函数如下所示:

      

    cuda device = None,non_blocking = False )→张量

您可以做什么:

  • 只调用cuda()而没有任何参数应该可以正常工作。

  • 有两个参数(devicenon_blocking)可用于调用cuda()
    您没有写您想做的事,但non_blocking可能正是您想要的:

      
        
    • non_blocking (布尔):
      如果True并且源位于固定内存中,则   复制将相对于主机是异步的。否则,   参数无效。默认值:False
    •   
  • 总是很高兴看一下文档:
    https://pytorch.org/docs/stable/tensors.html#torch.Tensor.cuda



作为附件:如果您对async的实际用途感兴趣,可以在这里查看: https://www.python.org/dev/peps/pep-0492/#new-syntax

答案 1 :(得分:2)

有一个async参数,但现在不推荐使用,因为async在Python 3.7中成为保留字。详细信息包含在本期rename .cuda(async=..) parameters中。您可以使用non_blocking作为替代。