Closed syleeie2310 closed 3 months ago
어제 데이터브릭스 api 는 이렇게 하면 배포가 되긴 하네요ㅎㅎ
-> Create serving endpoint
벡터 서치 만든 다음에 이것도 한번 나중에 하나만 해주세요~ 어떤 모델이 좋을지는 모르겠는데.. 아래 메뉴얼 대로 하면 되네요.
[Recommended] Deploy foundation models from Unity Catalog https://docs.databricks.com/en/machine-learning/foundation-models/deploy-prov-throughput-foundation-model-apis.html
아래 모델로 한번 테스트 해봐도 좋을듯. meta_llama_v3_1_8b
@syleeie2310 멘토님 벡터서치 엔드포인트 설정하려고 했는데 이런 문구가 뜨네요,,
헉..ㅠㅠ 맙소사..
이거 제가 다시 봐볼게요 ㅠㅠ
@oh-bom 이거 당장 해결하기 어려울듯 해서;; 저희가 사용하는 데이터브릭스가 교육 계정이라서 trial 이라서 안되었는데 제가 늦게 파악을 해버렸네요. 되는줄 알았는데 곤란해졌네요.
우선 어쩔 수 없이 오픈소스 쪽으로 방향을 선회해야 될듯 해서 아래 예제 구현부터 해보고 계시겠어요? 벡터 DB 많이 쓰는게 faiss, chromadb 등을 써야 될듯 해서 방법을 바꿔야 될듯 합니다.
오픈소스로 벡터 DB 부터 몇개 좀 알아와주세요!
@oh-bom 이거 당장 해결하기 어려울듯 해서;; 저희가 사용하는 데이터브릭스가 교육 계정이라서 trial 이라서 안되었는데 제가 늦게 파악을 해버렸네요. 되는줄 알았는데 곤란해졌네요.
우선 어쩔 수 없이 오픈소스 쪽으로 방향을 선회해야 될듯 해서 아래 예제 구현부터 해보고 계시겠어요? 벡터 DB 많이 쓰는게 faiss, chromadb �등을 써야 될듯 해서 방법을 바꿔야 될듯 합니다.
오픈소스로 벡터 DB 부터 몇개 좀 알아와주세요!
@syleeie2310 네 알겠습니다!
@syleeie2310 멘토님,,또 시작부터 질문드립니다 보내주신 예제 따라하는데
이 부분을 구현한게 다음사진입니다
예제에 나와있는 위키피디아 데이터를 가져와도, asac 유니티 카탈로그의 메타 데이터를 가져와도, 모두 데이터 타입이 class 'pyspark.sql.connect.dataframe.DataFrame'>
로 뜹니다
찾아보니까
https://community.databricks.com/t5/data-engineering/pyspark-sql-connect-dataframe-dataframe-vs-pyspark-sql-dataframe/td-p/71055
저와 비슷한 문제에 대한 q&a 내용이 있더라구요.. 근데 해결책으로 참고할 내용은 없어요ㅜ.ㅜ
혹시 'pyspark.sql.connect.dataframe.DataFrame
-> 'pyspark.sql.dataframe.DataFrame
로 변환하는 방법 아시나요??ㅜ.ㅜㅜ
거기 댓글 보니깐 싱글 클러스터로 하면 pyspark.sql.dataframe.Dataframe으로 하면 된다고 하네요 싱글 클러스터 만들어서 아예 하시겠어요?
만드는 방법을 알려드릴게요
이렇게 해서 스펙을 Cretae with Personal Cluster 하시고 클러스터 이름 정하시고 node.type은 i3.xlarge 하시고 런타임 버전은 15.3 하셔도 되고 낮은 버전 사용해도 되긴 합니다. 대신 terminate after inactivitiy 설정을 30분으로 해주세요.
여기에서 Cretae with Personal Cluster 2번째 스크린샷이 잘못 들어갔네요!
그리고 혹시 안되면 다른 벡터DB 방법도 한번 찾아보시구요~ chromadb
그리고 개인 클러스터에서 하면 어제 에러난 부분은 이제 잘되는데
아래 OpenAIEmbeddings() 할때 OPEN_AI_KEY가 필요하거든요.
그건 OPEN AI 사이트 가서 가입해서 키 발급해서 쓰셔야 될듯 합니다~ 아래 KEY값 설정 필요) (os.environ["OPENAI_API_KEY"]="")
@syleeie2310 안녕하세요 멘토님 llm모델 연결하다가 궁금한게 조금 많아져서 노션에 질문을 정리해 두었습니다.. 시간 나실때 읽어봐주시고 천천히 답변 부탁드려요.. 🥹 https://www.notion.so/ohbom/7-29-LLM-model-0300bb9e51b84e6eaae02fb73b8455b4
[1] 모델 객체 받아오기 현재 연결한 gpt4o mini는 endpoint 연결한건 봤고, Open LLM 모델 활용할거면 직접 받거나 허깅페이스에서 불러와야 될듯 해요. 아래 사이트에서 github 다운로드 받은 다음에 github에서 ./download.sh 에서 모델 받은 다음에 dbfs에 올려서 써야 될듯 해요. https://llama.meta.com/llama-downloads
dbfs는 카탈로그 가서 Browse DBFS 가면 찾을 수 있어요. mlflow에서 만들어진 pyfunc.load_model에는 총 3가지가 있는데 https://docs.databricks.com/en/mlflow/models.html#api-commands 참고하면 되요 Mlflow 통해서 모델 객체를 받는 형태는 외부 API에서 받아오는게 아니라 위 Llama 3 예제처럼 로컬에 받아놓고 모델을 가지고 있을 때 이야기라 sLM에서 사용하거나 꼭 LLM이 아니라 다른 추천시스템 모델 같은것도 만들 순 있어요.
[2] Serving endpoint로 연결만 하기 네 gpt4-4o-mini가 question, answer만 하는게 맞긴 해요. 근데 RAG 구성할 때 저도 헷갈리는데, OpenAI 라이브러리 활용할 때 LLM Model + 리트리버까지 합쳐서 mlflow로 endpoint를 만들수 있다고 생각했거든요. 다만 현재 데이터브릭스 환경에선 안되서 그걸 ec2 서버에서 배포해야 됩니다. 그래서 question, answer를 저장하는 형태라기 보단 LLM Model + 원하는 RAG Retriver를 저장하는 형태로 이해했어요 저는
아래 예제는 langchian에서 RetrievalQA chain 역할만 나와 있어요. https://docs.databricks.com/en/_extras/notebooks/source/machine-learning/large-language-models/pyspark-dataframe-loader-langchain.html
제가 시간이 없어서 2번 쪽은 저녁에 고민 더 해볼게요 리서치 같이 해보시죠.
근데 RetrievalQA.from_chain_type(llm=OpenAI(), chain_type="stuff", retriever=db.as_retriever()) 에서 llm=OpenAI() <- 요 부분이 LLM 모델에서 해야 되는 역할이거 같아요. 저 부분을 gpt4o로 바꿀수 있구요.
결국 RAG 구성한 챗봇은 우리가 데이터에서 찾을 Retrieval + Prompt + ChatModel + OutputParser로 결과를 내보내는거라서 LLM 모델은 ChatModel에서 통제할거 같구요! https://rfriend.tistory.com/823
근데 위 구성을 Deploy 할 때 Rest API로 만들거면 langchian에 있는 langserve 를 이용해서 배포해도 좋고 mlflow로 배포해도 되는데요. 현재 배포 환경은 데이터브릭스에선 불가능하고 ec2 서버에서 해야될듯 하고 주로 차이는 LangServe는 대화형 NLP 애플리케이션의 배포에 적합하고, MLflow는 보다 광범위한 머신러닝 모델의 실험 및 배포 관리를 지원하니 그런 차이가 있을듯.
이해가 될려나 모르겠는데 우선 해보면서 다시 좀 정리해보시죠. !!
그리고 허깅페이스 모델마다 다운로드 받아서 바로 사용 가능한 모델도 있고 권한 요청해서 승인(?)을 받아야 되는 모델이 있는거 같아요.
@syleeie2310 멘토님 databricks mlflow model을 ec2에서 서빙하려면
제가 늦게 봤네요. 우선 데이터브릭스 노트북에서 mlflow 라이브러리 사용하여 모델을 save_model로 저장 (dbfs 파일 위치 <- 이게 결국 s3)
s3를 해당 ec2에서 접근하려면 python 또는 jupyter에서 테스트 해보셔야 될듯 해요. 근데 아마도(?) 네트워크가 안열려있을거 같아서 주말에 제가 좀 봐야될듯 해요.
s3://asacdataanalysis/oregon-prod/3001521127938963 왼쪽이 s3 위치거든요. 저장하면 아래 폴더 중에 들어가거 됩니다.
그래서 s3 접근이 우선 어렵다면 다른 방법을 우회해보자면 다음과 같습니다.
시간나서 해봤는데 연결했어요! @oh-bom
http://34.212.99.54:8888/notebooks/workspace%2Fsyleeie%2Fs3%20connection.ipynb
아래 위치에 있어요. 제가 AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY는 aws cli 패키지 설치해서 configure 설정했어요 https://loosie.tistory.com/208
boto 라이브러리 활용해서 mlflow 연결하심 될듯 해요
@syleeie2310 멘토님 벡터디비 그동안은 샘플데이터로 해서 문제가 없었는데 이번에 전체 데이터 올리려고하니까 계속 이 에러가 떠서요
혹시 개인 클러스터 노드 타입 키워도 되나요?
@oh-bom 네 개인 클러스터 드라이브 타입을 시리즈 1개만 올려서 다시 해보시겠어요? r6id.xlarge -> r6id.2xlarge
아.제가 희선님 클러스터로 잘못 봐서 i3.large 쓰고 있었군요. i3.2xlarge로 바꾸심 됩니다.
메타 데이터 47만건 raw로 document 분리해서 올리기 리뷰 데이터 47만건 raw로 document 분리해서 올리기
@syleeie2310 안녕하세요 멘토님 메타데이터 벡터 디비에 업로드 하는것 관련해서 질문드립니다,,,
계속 이렇게 해볼까요 아님 행마다 index 생성하는거로 다시 진행 해볼까요?,,
@oh-bom faiss 형태가 데이터브릭스 벡터 서치랑 비슷한 줄 알았는데, 다른가 보군요. 원래 데이터브릭스 벡터 DB는 저렇게 primary key를 넣고 들어가는거거든요.
검색했을 때 fasis 인덱스는 아래 형태로 나뉜다는데 저희 유형은 어떤 형태인건가요?
파시스는 다양한 유형의 인덱스를 지원합니다. 가장 기본적인 유형의 인덱스는 ‘플랫(flat)’ 인덱스로, 이는 간단히 모든 벡터 간의 거리를 계산하는 방식입니다. 그러나 이러한 방식은 매우 비효율적이기 때문에, 파시스는 추가적으로 ‘계층적(hierarchical)’ 인덱스와 ‘제품(product)’ 인덱스를 지원합니다. 계층적 인덱스는 벡터 공간을 여러 계층으로 나누어 검색을 최적화하며, 제품 인덱스는 여러 벡터를 조합하여 더 복잡한 벡터를 생성하고 이를 인덱스화합니다.
단순하게 플랫 인덱스로 전체를 넣으면 비효율적이라 계층적으로 넣는다는데 그럼 카테고리 단위로 넣는거 같기도 하구요.
[참고 예제] https://tkayyoo.tistory.com/182 [참고 예제2] https://manangarg.medium.com/implementing-faiss-vector-similarity-search-for-recommendations-faa5149f55de [참고 예제3] https://www.kaggle.com/code/aiswaryaramachandran/building-movie-recommendation-system-using-faiss
FAISS는 실제로 다양한 방법을 통해 검색 효율성을 높이는 옵션을 제공하는데, 인덱스를 Voronoi 셀로 분할 하는 것이 인기 있는 접근 방식입니다. 이 방법을 사용하면 쿼리 벡터를 가져와서 해당 벡터가 속한 셀을 확인한 다음 'IndexFlatL2'를 사용하여 쿼리 벡터와 해당 셀 내의 모든 인덱스 벡터를 검색합니다. 또한 필요한 경우 인근 다른 셀의 벡터를 포함할 수 있습니다.
인덱스가 여러 종류가 있는거 같은데 추천시스템에 적절한 인덱스를 찾아야 될거 같아요. 참고 예제2~3이 추천시스템 관련된 예제인데 한번 봐주세요!
https://platform.openai.com/docs/guides/embeddings/embedding-models @YoonjungJang , @oh-bom
@syleeie2310 안녕하세요 멘토님! 메터 raw데이터가 현재 데이터브릭스에는 남아있지않아서 다시 올려서 사용하려고 합니다 캘리포니아 메타 json 파일 받은 후, 데이터브릭스에서 create table ui로 해서 업로드 하니까, 하나의 행만 인식해서 들어가더라구요 ㅠㅠ json 파일안에 데이터 형식이 안맞는게 있는지 확인하려했는데 , 데이터가 너무 커서 체크해주는 웹에서도 확인이 안되네요..🥹 혹시 맨처음에 브론즈 데이터 업로드시 따로 전처리 하시고 올리셨던걸까요?
@oh-bom 아..맞다 저번에 S3 정리한다고 일부 데이터 지웠는데 따로 보관해둔게 없었군요. 제가 이따가 밤에 올려둘게요 한 9시 이후에.. 그리고 말해둘게요 path
아님 다른 데이터로 먼저 테스트 코드는 짜봐도 될듯 해요, 이전에 전처리 안한 데이터가 아래 형태랑 동일하니깐 그걸로 해보셔도 될듯 해요 :)
asacdataanalysis.default.meta_hawaii
캘리포니아 메타 데이터 Spark API Format : dbfs:/data/meta-California.json.gz File API Format : /dbfs/data/meta-California.json.gz
리뷰 데이터도 혹시 필요할지 모르니 받아서 해당 위치에 올려둘게요~ 그건 좀 커서 다운로드가 걸리네요
그리고 임베딩 모델을 생각해보니깐 허깅페이스에서 받아서 cpu에서 추론 가능하면 그렇게 쓰는게 낫지 않을까요?
OpenAI Embedding 에 비용이 많이 들면. 그렇게 해야 될거 같은데 리뷰 데이터도 만약 나중에 그렇게 해야한다면...
-> LLM API 만 gpt4-mini 사용하고 임베딩 모델은 다른것 사용하기
이런 리더보드가 있긴하던데 Retrieval 주제로 보니깐 https://huggingface.co/spaces/mteb/leaderboard
메모리 작은 사이즈로 할 수 있어보이는게 아래 같은 것들이 있어서 다음주에 시도해봐도 좋을거 같긴 하네요. 근데 cpu에서 허깅페이스 불러오면 rag 올릴 때 조금 오래걸릴거 같긴하네요.
stella_en_1.5B_v5 stella_en_400M_v5 gte-large-en-v1.5
우선 LLM RAG 추천 모델(메타 데이터) 부터 만드는 것 부터 집중해보시고 메타 완료되면 임베딩 모델 바꿀지 그때 판단해보시죠~!!
참고할만한 자료 Book Recommendation using Retrieval Augmented Generation https://medium.com/@mrunmayee.dhapre/book-recommendation-using-retrieval-augmented-generation-52965b71ed16
더 괜찮은 자료 있으면 저도 찾아서 공유드릴게요!!
추천시스템 RAG 접근 방식에 따라서 2가지 방법이 있는거 같아요.
1) 일반적인 RAG 구성 형태 (데이터를 적당하게 document로 만들어서 chunk해서 사용) https://github.com/taherfattahi/recommendation-systems-by-llms/blob/master/recommendation-systems.ipynb https://github.com/Mrunmayeed/ChatbotRAG/blob/main/BookRecommendationRAG.ipynb
2) 3일전에 보내줬던 예시 형태 -> IndexIVFPQ (raw 단위 별로 임베딩 값을 만들어서 인덱스 구성, 들어온 쿼리를 임베딩으로 구성해서 비교해서 찾아주는 형태, cosine 유사도) https://www.kaggle.com/code/aiswaryaramachandran/building-movie-recommendation-system-using-faiss
1,2 구성 별로 index 구성이 달라지다보니.. 저도 혼선이 조금 있었는 듯. 한번 메타 데이터 경우 머가 좋을지 @YoonjungJang , @oh-bom 님과 이야기 해보고 말씀해주세요. 추천 아이템을 결국 알려줘야 되는 문제 관점으로 한번 고민해주시고
메타 데이터부터 완료된 다음에 리뷰 데이터 RAG는 따로 또 생각해봐야 될거 같아요. 그쪽이 더 커서..
page_content -> 모든 컬럼들의 정보를 하나의 문자열로 합쳐서 넣기
chunk 마다 인덱스가 들어갔음 (indeflatl2)
indexIVF-PQ는 구조가 다름 -> 786차원 -> 4차원 -> 192차원으로 4개로 쪼개짐 -> v1~v4 벡터 0~255 숫자 노트북 중 대표 지점 하나로 표현 (8bits) -> [42,128,4,200] 으로 변환. -> n_list(n-centroids) -> 클러스터링
메타 데이터 전체 돌리기.
1) 리뷰 + 메타 데이터 조인해서 데이터를 index 해서 올려서 LLM 테스트 해보기 (300개 정도) 2) 리뷰 / 메타랑 별도로 분리해서 RAG 구성하기
=> gmap_id 둘다 포함 (CF)
id는 uuid 넣고
page_content : combined_meta
meta_data : name, gmap_id id, page_content
meta_data : 아무것도 안넣는게 가장 나은 방식 47만개 -> 허깅페이스 모델 받아서 해봤는데. 몇시간 짜리. (BAAI/bge-base-en-v1.5) (-> bert 임베딩 방법부터 먼저 진행해보고)
리뷰/메타 둘다 10만개 정도만 적당히 샘플링해서 벡터DB에 넣어보기
openai embedding 10만개 식 메타/리뷰 -> 12불 / 12불
메타,리뷰 데이터 > 벡터 서치 올리기
https://docs.databricks.com/en/generative-ai/create-query-vector-search.html