본문 바로가기

프로그래밍/AI:ML:DL

[BERT] bert-as-service server port conflict on windows

반응형

bert-as-service 프로젝트를 윈도우에서 테스트해 보았다. (2019년 2월)

방법은 간단하다.

  • 파이썬 가상환경을 만들고,
  • 프로젝트 소개에서 지시하는 패키지들을 깔고,
  • pretrained bert model 을 다운받아 로컬폴더에 풀고,
  • 가상환경 script 폴더의 bert-serving-start 를 적당한 인자를 주어 실행한다.


그런데, 이 과정에서 에러가 발생하며 서버가 실행되지 않아 고생을 조금 했다. (결국에는 성공함.)


에러메시지는 다음과 같다.

C:\PythonEnv\bertsvc3664\Scripts>bert-serving-start.exe -model_dir c:\BertModels\multi_cased_L-12_H-768_A-12 -num_worker=2
usage: C:\PythonEnv\bertsvc3664\Scripts\bert-serving-start -model_dir c:\BertModels\multi_cased_L-12_H-768_A-12 -num_worker=2
                 ARG   VALUE
__________________________________________________
           ckpt_name = bert_model.ckpt
         config_name = bert_config.json
                cors = *
                 cpu = False
          device_map = []
  fixed_embed_length = False
                fp16 = False
 gpu_memory_fraction = 0.5
       graph_tmp_dir = None
    http_max_connect = 10
           http_port = None
        mask_cls_sep = False
      max_batch_size = 256
         max_seq_len = 25
           model_dir = c:\BertModels\multi_cased_L-12_H-768_A-12
          num_worker = 2
       pooling_layer = [-2]
    pooling_strategy = REDUCE_MEAN
                port = 5555
            port_out = 5556
       prefetch_size = 10
 priority_batch_size = 16
show_tokens_to_client = False
     tuned_model_dir = None
             verbose = False
                 xla = False

I:[35mVENTILATOR[0m:freeze, optimize and export graph, could take a while...
I:[36mGRAPHOPT[0m:model config: c:\BertModels\multi_cased_L-12_H-768_A-12\bert_config.json
I:[36mGRAPHOPT[0m:checkpoint: c:\BertModels\multi_cased_L-12_H-768_A-12\bert_model.ckpt
I:[36mGRAPHOPT[0m:build graph...
I:[36mGRAPHOPT[0m:load parameters from checkpoint...
I:[36mGRAPHOPT[0m:optimize...
I:[36mGRAPHOPT[0m:freeze...
I:[36mGRAPHOPT[0m:write graph to a tmp file: C:\Users\Daewon\AppData\Local\Temp\tmp73xuhye6
I:[35mVENTILATOR[0m:optimized graph is stored at: C:\Users\Daewon\AppData\Local\Temp\tmp73xuhye6
I:[35mVENTILATOR[0m:bind all sockets
I:[35mVENTILATOR[0m:open 8 ventilator-worker sockets
I:[35mVENTILATOR[0m:start the sink
Process BertSink-2:
Traceback (most recent call last):
  File "C:\Python3664\lib\multiprocessing\process.py", line 258, in _bootstrap
    self.run()
  File "c:\pythonenv\bertsvc3664\lib\site-packages\bert_serving\server\__init__.py", line 246, in run
    self._run()
  File "c:\pythonenv\bertsvc3664\lib\site-packages\zmq\decorators.py", line 75, in wrapper
    return func(*args, **kwargs)
  File "c:\pythonenv\bertsvc3664\lib\site-packages\zmq\decorators.py", line 75, in wrapper
    return func(*args, **kwargs)
  File "c:\pythonenv\bertsvc3664\lib\site-packages\zmq\decorators.py", line 75, in wrapper
    return func(*args, **kwargs)
  File "c:\pythonenv\bertsvc3664\lib\site-packages\bert_serving\server\__init__.py", line 254, in _run
    sender.bind('tcp://*:%d' % self.port)
  File "zmq\backend\cython\socket.pyx", line 547, in zmq.backend.cython.socket.Socket.bind
  File "zmq\backend\cython\checkrc.pxd", line 25, in zmq.backend.cython.checkrc._check_rc
zmq.error.ZMQError: Address in use


제일 마지막 에러 메시지는 Address in use (주소가 사용중) 이고, 두 줄 올라가보면, socket.socket.bind (c 의 소켓API 등에 익숙한 사람들은 알겠지만, 서버의 종류, 주소, 포트번호를 인자로 주어 열어놓는 함수) 에서 문제가 발생했다.

그리고, 실행직후 로그로 남기는 ARG 들 중에 port, port_out 이 각각 5555, 5556 으로 지정되어 있는 것을 알 수 있다.

그래서, tcpview 를 열어 혹시 5555, 5556 포트를 다른 프로세스에서 사용중인지 확인해 보았다.


tcpview 를 열고, local port 로 정렬해 보니, 아니나 다를까, chrome 프로세스가 5556 포트를 이미 사용중이었다. (이 프로세스는 taskbar 에 상주하는 프로세스로, 브라우저를 다 죽여도 살아 있음. 작업줄의 아이콘에서 죽여야 죽는다.)

이것이 문제였던 것 같고, 해결방법은 아마도 다음 두가지가 있을 것 같다.

  • 크롬 프로세스를 모두 종료하여, 5555, 5556 포트가 사용중이지 않은 것을 확인하고 서버를 실행.
  • 서버를 실행시킬 때 실행인자로 port, port_out 을 지정하여 실행



728x90