우분투를 다시 한번 싹- 밀고 날 것 그 자체의 환경에서
이전에 개발했던 객체 검출 모델을 사용한 코드의 동작 테스트를 진행하던 중 아래와 같은 에러를 마주했다.
attributeerror: 'upsample' object has no attribute 'recompute_scale_factor'
File /usr/local/lib/python3.8/site-packages/torch/nn/modules/upsampling.py:154, in Upsample.forward(self, input)
152 def forward(self, input: Tensor) -> Tensor:
153 return F.interpolate(input, self.size, self.scale_factor, self.mode, self.align_corners,
--> 154 recompute_scale_factor=self.recompute_scale_factor)
File /usr/local/lib/python3.8/site-packages/torch/nn/modules/module.py:1185, in Module.__getattr__(self, name)
1183 if name in modules:
1184 return modules[name]
-> 1185 raise AttributeError("'{}' object has no attribute '{}'".format(
1186 type(self).__name__, name))
AttributeError: 'Upsample' object has no attribute 'recompute_scale_factor'
위의 두 부분 말고도 더 많은 문구가 있었지만 가장 핵심인 부분만 가져와 넣었다.
해당 코드를 동작시키는 환경은 RTX3080, CUDA 11.1, CUDNN 8.0.5, python 3.8,
cudatoolkit==10.2, torch==1.11.0, torchvision==0.10.0, torchaudio==1.12.1이다.
처음엔 torch 버전을 잘못 설치한 것 같아서 이전에 작성했던
https://iambeginnerdeveloper.tistory.com/176?category=916615
해당 글을 보고 torch를 재 설치하였으나 해결이 되지 않았다.
그래서 에러 문구를 내 뱉은 코드를 하나씩 들어가 보았고
File /usr/local/lib/python3.8/site-packages/torch/nn/modules/upsampling.py:154, in Upsample.forward(self, input)
152 def forward(self, input: Tensor) -> Tensor:
153 return F.interpolate(input, self.size, self.scale_factor, self.mode, self.align_corners,
--> 154 recompute_scale_factor=self.recompute_scale_factor)
해당 upsampling.py 코드에서 154번째 줄에서 에러가 발생하였기에 열심히 구글링을 해 보았다.
찾아보니까 python 3.8 환경에서 torch 버전이 1.10.0보다 높을 때 발생하는 에러같았고 torch 버전을 1.10.0보다 낮추거나 해당 부분을 주석처리하면 해결된다는 것이다.
그래서 아래와 같이 umsampling.py에서 해당 부분을 주석처리하고
다시 코드를 작동 시켰더니 에러가 발생하지 않고 제대로 작동하였다.
def forward(self, input: Tensor) -> Tensor:
return F.interpolate(input, self.size, self.scale_factor, self.mode, self.align_corners,
# recompute_scale_factor=self.recompute_scale_factor
)
+)
주석처리만으로도 해결이 된다는 찝찝함에 torch 버전을 낮추자니 설치된 cuda 버전이랑 torch 버전이 안맞으면 cuda runtime error가 발생해서 선택권이 없었다.
주석처리가 가장 좋은 방법인 건 맞는지 의문이지만 열심히 구글링 해 본 결과 주석처리가 최선인 것 같긴 하다....