hyunwoongko / kochat

Opensource Korean chatbot framework
Apache License 2.0
450 stars 183 forks source link

[BUG] FileNotFoundError #8

Closed na2na8 closed 4 years ago

na2na8 commented 4 years ago

안녕하세요, 자연어 처리를 공부하는 학생인데 좋은 코드를 공유해주셔서 감사합니다.

노트북과 Google Colaboratory 두 군데에서 실행을 해 보았는데요 모두 공통적인 에러가 생겼습니다.

IntentClassifier

intent_classifier=(clf, True)

/usr/local/lib/python3.6/dist-packages/smart_open/smart_open_lib.py:253: UserWarning: This function is deprecated, use smart_open.open instead. See the migration notes for details: https://github.com/RaRe-Technologies/smart_open/blob/master/README.rst#migrating-to-the-new-open-function
'See the migration notes for details: %s' % _MIGRATION_NOTES_URL
test
---------------------------------------------------------------------------
FileNotFoundError                         Traceback (most recent call last)
<ipython-input-24-9c1b6a9984f6> in <module>()
18     entity_recognizer=(rcn, False),
19     scenarios=[
---> 20         weather
21     ]
22     # scenarios=[

5 frames /content/drive/My Drive/kochat/kochat/utils/visualizer.py in __load_txt(self, mode) 279 """ 280 --> 281 f = open(self.modeldir + 'temp{}{mode}.txt'.format(_=self.delimeter, mode=mode), 'r') 282 file = f.read() 283 file = re.sub('\[', '', file)

FileNotFoundError: [Errno 2] No such file or directory: '/content/drive/My Drive/kochat/saved/IntentClassifier/temp/train_accuracy.txt'


>  EntityRecognizer 
~~~python
entity_recognizer=(rcn, True)
/usr/local/lib/python3.6/dist-packages/smart_open/smart_open_lib.py:253: UserWarning: This function is deprecated, use smart_open.open instead. See the migration notes for details: https://github.com/RaRe-Technologies/smart_open/blob/master/README.rst#migrating-to-the-new-open-function
  'See the migration notes for details: %s' % _MIGRATION_NOTES_URL
test
---------------------------------------------------------------------------
FileNotFoundError                         Traceback (most recent call last)
<ipython-input-23-f8dc28e96af9> in <module>()
     18     entity_recognizer=(rcn, True),
     19     scenarios=[
---> 20         weather
     21     ]
     22     # scenarios=[

5 frames
/content/drive/My Drive/kochat/kochat/utils/visualizer.py in __load_txt(self, mode)
    279         """
    280 
--> 281         f = open(self.model_dir + 'temp{_}{mode}.txt'.format(_=self.delimeter, mode=mode), 'r')
    282         file = f.read()
    283         file = re.sub('\\[', '', file)

FileNotFoundError: [Errno 2] No such file or directory: '/content/drive/My Drive/kochat/saved/EntityRecognizer/temp/train_accuracy.txt'

해당 코드는 Google Colaboratory 코드입니다.

from flask import render_template

from kochat.app import KochatApi
from kochat.data import Dataset
from kochat.loss import CRFLoss, CosFace, CenterLoss, COCOLoss, CrossEntropyLoss
from kochat.model import intent, embed, entity
from kochat.proc import IntentClassifier, GensimEmbedder, EntityRecognizer, SoftmaxClassifier
from flask import Flask
# from demo.scenrios import restaurant, travel, dust, weather
from demo.scenrios import weather
dataset = Dataset(ood=True)
emb = GensimEmbedder(model=embed.FastText())

clf = IntentClassifier(
    model=intent.CNN(dataset.intent_dict),
    loss=CenterLoss(dataset.intent_dict),
)

rcn = EntityRecognizer(
    model=entity.LSTM(dataset.entity_dict),
    loss=CRFLoss(dataset.entity_dict)
)

kochat = KochatApi(
    dataset=dataset,
    embed_processor=(emb, True),
    intent_classifier=(clf, True),
    entity_recognizer=(rcn, True),
    scenarios=[
        weather
    ]
    # scenarios=[
    #     weather, dust, travel, restaurant
    # ]
)

# added
kochat.app = Flask(__name__)
run_with_ngrok(kochat.app)   #starts ngrok when the app is run

@kochat.app.route('/')
def index():
    return render_template("index.html")

if __name__ == '__main__':
    kochat.app.template_folder = '/content/drive/My Drive/kochat/' + 'templates'
    kochat.app.static_folder = '/content/drive/My Drive/kochat/' + 'static'
    # kochat.app.template_folder = kochat.root_dir + 'templates'
    # kochat.app.static_folder = kochat.root_dir + 'static'
    kochat.app.run()

다음과 같이 코드를 돌렸을 때, saved의 IntentClassifier과 EntityRecognizer의 temp 폴더에 train과 관련된 save 데이터가 저장되지 않는 것을 확인하였습니다. (Test_*.txt파일의 경우엔 모두 저장된 것 같습니다.)

IntentClassifier image

EntityRecognizer image

이 부분을 무시하고

kochat = KochatApi(
    dataset=dataset,
    embed_processor=(emb, False),
    intent_classifier=(clf, False),
    entity_recognizer=(rcn, False),
    scenarios=[
        weather
    ]
    # scenarios=[
    #     weather, dust, travel, restaurant
    # ]
)

이와 같이 True에서 False로 하여 데모를 돌렸을 때에는 image 다음과 같은 서버 연결 실패 문제가 발생합니다.

로그는 다음과 같습니다.

 * Serving Flask app "__main__" (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
 * Running on http://1b6ad93801ad.ngrok.io
 * Traffic stats available on http://127.0.0.1:4040
127.0.0.1 - - [07/Jul/2020 06:13:45] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [07/Jul/2020 06:13:46] "GET /static/css/bootstrap.css HTTP/1.1" 200 -
127.0.0.1 - - [07/Jul/2020 06:13:46] "GET /static/css/main.css HTTP/1.1" 200 -
127.0.0.1 - - [07/Jul/2020 06:13:46] "GET /static/js/jquery.js HTTP/1.1" 200 -
127.0.0.1 - - [07/Jul/2020 06:13:46] "GET /static/js/bootstrap.js HTTP/1.1" 200 -
127.0.0.1 - - [07/Jul/2020 06:13:46] "GET /static/js/main.js HTTP/1.1" 200 -
127.0.0.1 - - [07/Jul/2020 06:13:48] "GET /favicon.ico HTTP/1.1" 404 -

Running on http://1b6ad93801ad.ngrok.io -> 여기서 데모를 돌려보았습니다.

train_*.txt파일이 생성되지 않아 생기는 문제에 대한 해결방안을 알려주신다면 정말 감사하겠습니다.

hyunwoongko commented 4 years ago

현재 깃에 올라온 버전 소스코드로 실행하신건가요? 죄송합니다 ㅜㅜ 제 불찰이네요. 현재버전은 아직 완성된 버전이 아닙니다. 리드미에 내용을 추가하였습니다. (KNN 알고리즘 부분만 변경하고 파일 저장이나 이런건 아직 업데이트를 못했습니다. 리드미에 관련 내용을 작성하겠습니다)

오늘중에 실험해보시고 싶으시면 느려도 pip로 설치해서 사용하는 버전을 사용해주세요. (KNN이 GPU 가속이 안되어서 학습 속도가 10배정도 느립니다) 현재 깃에 올라온 버전은 KNN 알고리즘 변경까지만 작업했고, 아직 파일 저장 등의 내용은 수정이 안되었습니다.만약 pip 버전 (1.0.3 버전으로 사용해도 문제가 발생되신다면 다시 말씀해주시길 바랍니다. 참고로 이전버전(1.0.3)에서는 IntentClassifier가 아니라, DistanceClassifier라는 이름으로 이용하셔야합니다. 제가 가능하면 오늘내일 중에 완벽하게 만들어서 Git과 pip에 업로드하여 저장하고 다시 답장 이슈를 띄워드리겠습니다.

na2na8 commented 4 years ago

안녕하세요, 답변 주셔서 정말 감사합니다. train_*.txt 파일이 생성되게 바뀐 버전으로 실행하니 학습이 되는 것을 확인했습니다. 안타깝게도 RAM 문제로 모두 돌리지 못해 배치 사이즈를 조금씩 줄여가며 학습 중입니다. RAM 때문에 IntentClassifier가 학습되는 것까지만 볼 수 있었습니다.

image

완벽한 버전이 기대됩니다 :)

hyunwoongko commented 4 years ago

메모리가 작으면 kochat_config.py에서 INTENT모델과 ENTITY모델의 크기 및 Layer를 줄여주세요. 정확도가 하락할 수는 있지만 모든 기능을 이용할 수 있습니다. 그리고, 현재 git에 올라온 코드는 제가 실험하면서 계속 바꾸기 때문에 배포된 버전 (1.0.3)을 이용해주시길 바랍니다.. (지금 깃에 올라온 코드는 학습/테스트만 되고 데모는 안돌아갑니다.. 저는 코어쪽 모델들 실험하느라 코드를 자주 변경하기 때문에 그 코드로 이용해도 데모는 돌아가지 않습니다)

colab도 jupyter환경이니 아마 !pip install kochat이라는 키워드를 넣으시고 실행하시면 알아서 라이브러리를 다운 받을거에요.

na2na8 commented 4 years ago

말씀하신대로 !pip install kochat으로 라이브러리 다운 받아서 돌려보았습니다.

from flask import render_template

from kochat.app import KochatApi
from kochat.data import Dataset
from kochat.loss import CRFLoss, CosFace, CenterLoss, COCOLoss, CrossEntropyLoss
from kochat.model import intent, embed, entity
from kochat.proc import DistanceClassifier, GensimEmbedder, EntityRecognizer, SoftmaxClassifier
from flask import Flask
# from demo.scenrios import restaurant, travel, dust, weather
from demo.scenrios import weather

말씀하신대로 IntentClassifier를 DistanceClassifier로 바꾸어서 진행하였습니다.

#IntentClassifier가 아니라, DistanceClassifier

dataset = Dataset(ood=True)
emb = GensimEmbedder(model=embed.FastText())

clf = DistanceClassifier(
    model=intent.CNN(dataset.intent_dict),
    loss=CenterLoss(dataset.intent_dict),
)

rcn = EntityRecognizer(
    model=entity.LSTM(dataset.entity_dict),
    loss=CRFLoss(dataset.entity_dict)
)

kochat = KochatApi(
    dataset=dataset,
    embed_processor=(emb, True),
    intent_classifier=(clf, True),
    entity_recognizer=(rcn, True),
    scenarios=[
        weather
    ]
    # scenarios=[
    #     weather, dust, travel, restaurant
    # ]
)

# added
kochat.app = Flask(__name__)
run_with_ngrok(kochat.app)   #starts ngrok when the app is run

@kochat.app.route('/')
def index():
    return render_template("index.html")

if __name__ == '__main__':
    kochat.app.template_folder = '/content/drive/My Drive/kochat/' + 'templates'
    kochat.app.static_folder = '/content/drive/My Drive/kochat/' + 'static'
    # kochat.app.template_folder = kochat.root_dir + 'templates'
    # kochat.app.static_folder = kochat.root_dir + 'static'
    kochat.app.run()

이런 코드로 돌려보았을 때

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-11-942085faf111> in <module>()
      6 clf = DistanceClassifier(
      7     model=intent.CNN(dataset.intent_dict),
----> 8     loss=CenterLoss(dataset.intent_dict),
      9 )
     10 

/usr/local/lib/python3.6/dist-packages/kochat/proc/distance_classifier.py in __init__(self, model, loss)
     30         self.label_dict = model.label_dict
     31         self.loss = loss.to(self.device)
---> 32         self.distance_estimator = DistanceEstimator(self.grid_search)
     33         self.fallback_detector = FallbackDetector(self.label_dict, self.grid_search)
     34         super().__init__(model, model.parameters())

AttributeError: 'DistanceClassifier' object has no attribute 'grid_search'

다음과 같은 에러가 발생합니다. 해당 문제는 어떻게 해결해야 할까요?

hyunwoongko commented 4 years ago

아.. 음.. kochat config 파일에 INTENT 딕셔너리에 'grid_search' : True를 추가해보세용. 해당버전의 config에는 그리드서치를 썼는데 현재버전에선 사용하지 않습니다. 그래도 안되면 깃에 지금 올라온 config 파일 말고 도큐먼트 3번 Gettimg Started에 있는 config 파일을 다운로드 받으셔서 사용하시는게 좋습니다. (깃에 올라온 코드는 아직 개발중인 코드이니 부디 보지 마시고.. 우선 도큐먼트만 봐주세요ㅠㅠ 거의 다 만들긴했는데 아직 배포하기엔 유효성을 좀 더 검증할 필요가 있어 보여서 개발만하고 배포하지 않았습니다. 금방 될줄알았는데, 꽤 걸리네요. 정상적인 동작을 위해서 배포버전 코드와 배포버전 문서에 나온 코드만 참고해주세요)