forked from opea-project/GenAIExamples
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add rerank finetuning example (opea-project#741)
* add rerank finetuning example. Signed-off-by: Ye, Xinyu <[email protected]> * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --------- Signed-off-by: Ye, Xinyu <[email protected]> Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
- Loading branch information
Showing
4 changed files
with
275 additions
and
12 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,57 @@ | ||
# Rerank Model Finetuning | ||
|
||
Rerank model finetuning is the process of further training rerank model on a dataset for improving its capability on specific field. | ||
|
||
## Deploy Rerank Model Finetuning Service | ||
|
||
### Deploy Rerank Model Finetuning Service on Xeon | ||
|
||
Refer to the [Xeon Guide](./docker/xeon/README.md) for detail. | ||
|
||
## Consume Rerank Model Finetuning Service | ||
|
||
### 1. Upload a training file | ||
|
||
Download a toy example training file `toy_finetune_data.jsonl` and upload it to the server with below command, this file can be downloaded in [here](https://github.com/FlagOpen/FlagEmbedding/blob/master/examples/finetune/toy_finetune_data.jsonl): | ||
|
||
```bash | ||
# upload a training file | ||
curl http://${your_ip}:8015/v1/files -X POST -H "Content-Type: multipart/form-data" -F "file=@./toy_finetune_data.jsonl" -F purpose="fine-tune" | ||
``` | ||
|
||
### 2. Create fine-tuning job | ||
|
||
After a training file `toy_finetune_data.jsonl` is uploaded, use the following command to launch a finetuning job using `BAAI/bge-reranker-large` as base model: | ||
|
||
```bash | ||
# create a finetuning job | ||
curl http://${your_ip}:8015/v1/fine_tuning/jobs \ | ||
-X POST \ | ||
-H "Content-Type: application/json" \ | ||
-d '{ | ||
"training_file": "toy_finetune_data.jsonl", | ||
"model": "BAAI/bge-reranker-large", | ||
"General":{ | ||
"task":"rerank", | ||
"lora_config":null | ||
} | ||
}' | ||
``` | ||
|
||
### 3. Manage fine-tuning job | ||
|
||
Below commands show how to list finetuning jobs, retrieve a finetuning job, cancel a finetuning job and list checkpoints of a finetuning job. | ||
|
||
```bash | ||
# list finetuning jobs | ||
curl http://${your_ip}:8015/v1/fine_tuning/jobs -X GET | ||
|
||
# retrieve one finetuning job | ||
curl http://localhost:8015/v1/fine_tuning/jobs/retrieve -X POST -H "Content-Type: application/json" -d '{"fine_tuning_job_id": ${fine_tuning_job_id}}' | ||
|
||
# cancel one finetuning job | ||
curl http://localhost:8015/v1/fine_tuning/jobs/cancel -X POST -H "Content-Type: application/json" -d '{"fine_tuning_job_id": ${fine_tuning_job_id}}' | ||
|
||
# list checkpoints of a finetuning job | ||
curl http://${your_ip}:8015/v1/finetune/list_checkpoints -X POST -H "Content-Type: application/json" -d '{"fine_tuning_job_id": ${fine_tuning_job_id}}' | ||
``` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,31 @@ | ||
# Deploy Rerank Model Finetuning Service on Xeon | ||
|
||
This document outlines the deployment process for a rerank model finetuning service utilizing the [GenAIComps](https://github.com/opea-project/GenAIComps.git) microservice on Intel Xeon server. The steps include Docker image creation, container deployment. We will publish the Docker images to Docker Hub, it will simplify the deployment process for this service. | ||
|
||
## 🚀 Build Docker Images | ||
|
||
First of all, you need to build Docker Images locally. This step can be ignored after the Docker images published to Docker hub. | ||
|
||
### 1. Source Code install GenAIComps | ||
|
||
```bash | ||
git clone https://github.com/opea-project/GenAIComps.git | ||
cd GenAIComps | ||
``` | ||
|
||
### 2. Build Docker Image | ||
|
||
Build docker image with below command: | ||
|
||
```bash | ||
export HF_TOKEN=${your_huggingface_token} | ||
docker build -t opea/finetuning:latest --build-arg https_proxy=$https_proxy --build-arg http_proxy=$http_proxy --build-arg HF_TOKEN=$HF_TOKEN -f comps/finetuning/docker/Dockerfile_cpu . | ||
``` | ||
|
||
### 3. Run Docker with CLI | ||
|
||
Start docker container with below command: | ||
|
||
```bash | ||
docker run -d --name="finetuning-server" -p 8015:8015 --runtime=runc --ipc=host -e http_proxy=$http_proxy -e https_proxy=$https_proxy opea/finetuning:latest | ||
``` |
109 changes: 109 additions & 0 deletions
109
RerankFinetuning/tests/test_rerank_finetuning_on_xeon.sh
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,109 @@ | ||
#!/bin/bash | ||
# Copyright (C) 2024 Intel Corporation | ||
# SPDX-License-Identifier: Apache-2.0 | ||
|
||
set -x | ||
|
||
WORKPATH=$(dirname "$PWD") | ||
LOG_PATH="$WORKPATH/tests" | ||
ip_address=$(hostname -I | awk '{print $1}') | ||
finetuning_service_port=8015 | ||
ray_port=8265 | ||
|
||
function build_docker_images() { | ||
cd $WORKPATH | ||
echo $(pwd) | ||
docker build -t opea/finetuning:latest --build-arg https_proxy=$https_proxy --build-arg http_proxy=$http_proxy --build-arg HF_TOKEN=$HF_TOKEN -f comps/finetuning/docker/Dockerfile_cpu . | ||
if [ $? -ne 0 ]; then | ||
echo "opea/finetuning built fail" | ||
exit 1 | ||
else | ||
echo "opea/finetuning built successful" | ||
fi | ||
} | ||
|
||
function start_service() { | ||
export no_proxy="localhost,127.0.0.1,"${ip_address} | ||
docker run -d --name="finetuning-server" -p $finetuning_service_port:$finetuning_service_port -p $ray_port:$ray_port --runtime=runc --ipc=host -e http_proxy=$http_proxy -e https_proxy=$https_proxy -e no_proxy=$no_proxy opea/finetuning:latest | ||
sleep 1m | ||
} | ||
|
||
function validate_microservice() { | ||
cd $LOG_PATH | ||
export no_proxy="localhost,127.0.0.1,"${ip_address} | ||
|
||
# test /v1/dataprep upload file | ||
URL="http://${ip_address}:$finetuning_service_port/v1/finetune/upload_training_files" | ||
cat <<EOF > test_data.json | ||
{"query": "Five women walk along a beach wearing flip-flops.", "pos": ["Some women with flip-flops on, are walking along the beach"], "neg": ["The 4 women are sitting on the beach.", "There was a reform in 1996.", "She's not going to court to clear her record.", "The man is talking about hawaii.", "A woman is standing outside.", "The battle was over. ", "A group of people plays volleyball."]} | ||
{"query": "A woman standing on a high cliff on one leg looking over a river.", "pos": ["A woman is standing on a cliff."], "neg": ["A woman sits on a chair.", "George Bush told the Republicans there was no way he would let them even consider this foolish idea, against his top advisors advice.", "The family was falling apart.", "no one showed up to the meeting", "A boy is sitting outside playing in the sand.", "Ended as soon as I received the wire.", "A child is reading in her bedroom."]} | ||
{"query": "Two woman are playing instruments; one a clarinet, the other a violin.", "pos": ["Some people are playing a tune."], "neg": ["Two women are playing a guitar and drums.", "A man is skiing down a mountain.", "The fatal dose was not taken when the murderer thought it would be.", "Person on bike", "The girl is standing, leaning against the archway.", "A group of women watch soap operas.", "No matter how old people get they never forget. "]} | ||
{"query": "A girl with a blue tank top sitting watching three dogs.", "pos": ["A girl is wearing blue."], "neg": ["A girl is with three cats.", "The people are watching a funeral procession.", "The child is wearing black.", "Financing is an issue for us in public schools.", "Kids at a pool.", "It is calming to be assaulted.", "I face a serious problem at eighteen years old. "]} | ||
{"query": "A yellow dog running along a forest path.", "pos": ["a dog is running"], "neg": ["a cat is running", "Steele did not keep her original story.", "The rule discourages people to pay their child support.", "A man in a vest sits in a car.", "Person in black clothing, with white bandanna and sunglasses waits at a bus stop.", "Neither the Globe or Mail had comments on the current state of Canada's road system. ", "The Spring Creek facility is old and outdated."]} | ||
{"query": "It sets out essential activities in each phase along with critical factors related to those activities.", "pos": ["Critical factors for essential activities are set out."], "neg": ["It lays out critical activities but makes no provision for critical factors related to those activities.", "People are assembled in protest.", "The state would prefer for you to do that.", "A girl sits beside a boy.", "Two males are performing.", "Nobody is jumping", "Conrad was being plotted against, to be hit on the head."]} | ||
EOF | ||
HTTP_RESPONSE=$(curl --silent --write-out "HTTPSTATUS:%{http_code}" -X POST -F 'files=@./test_data.json' -H 'Content-Type: multipart/form-data' "$URL") | ||
HTTP_STATUS=$(echo $HTTP_RESPONSE | tr -d '\n' | sed -e 's/.*HTTPSTATUS://') | ||
RESPONSE_BODY=$(echo $HTTP_RESPONSE | sed -e 's/HTTPSTATUS\:.*//g') | ||
SERVICE_NAME="finetuning-server - upload - file" | ||
|
||
if [ "$HTTP_STATUS" -ne "200" ]; then | ||
echo "[ $SERVICE_NAME ] HTTP status is not 200. Received status was $HTTP_STATUS" | ||
docker logs finetuning-server >> ${LOG_PATH}/finetuning-server_upload_file.log | ||
exit 1 | ||
else | ||
echo "[ $SERVICE_NAME ] HTTP status is 200. Checking content..." | ||
fi | ||
if [[ "$RESPONSE_BODY" != *"Training files uploaded"* ]]; then | ||
echo "[ $SERVICE_NAME ] Content does not match the expected result: $RESPONSE_BODY" | ||
docker logs finetuning-server >> ${LOG_PATH}/finetuning-server_upload_file.log | ||
exit 1 | ||
else | ||
echo "[ $SERVICE_NAME ] Content is as expected." | ||
fi | ||
|
||
# test /v1/fine_tuning/jobs | ||
URL="http://${ip_address}:$finetuning_service_port/v1/fine_tuning/jobs" | ||
HTTP_RESPONSE=$(curl --silent --write-out "HTTPSTATUS:%{http_code}" -X POST -H 'Content-Type: application/json' -d '{"training_file": "test_data.json","model": "BAAI/bge-reranker-base"}' "$URL") | ||
HTTP_STATUS=$(echo $HTTP_RESPONSE | tr -d '\n' | sed -e 's/.*HTTPSTATUS://') | ||
RESPONSE_BODY=$(echo $HTTP_RESPONSE | sed -e 's/HTTPSTATUS\:.*//g') | ||
SERVICE_NAME="finetuning-server - create finetuning job" | ||
|
||
if [ "$HTTP_STATUS" -ne "200" ]; then | ||
echo "[ $SERVICE_NAME ] HTTP status is not 200. Received status was $HTTP_STATUS" | ||
docker logs finetuning-server >> ${LOG_PATH}/finetuning-server_create.log | ||
exit 1 | ||
else | ||
echo "[ $SERVICE_NAME ] HTTP status is 200. Checking content..." | ||
fi | ||
if [[ "$RESPONSE_BODY" != *'{"id":"ft-job'* ]]; then | ||
echo "[ $SERVICE_NAME ] Content does not match the expected result: $RESPONSE_BODY" | ||
docker logs finetuning-server >> ${LOG_PATH}/finetuning-server_create.log | ||
exit 1 | ||
else | ||
echo "[ $SERVICE_NAME ] Content is as expected." | ||
fi | ||
|
||
sleep 3m | ||
} | ||
|
||
function stop_docker() { | ||
cid=$(docker ps -aq --filter "name=finetuning-server*") | ||
if [[ ! -z "$cid" ]]; then docker stop $cid && docker rm $cid && sleep 1s; fi | ||
} | ||
|
||
function main() { | ||
|
||
stop_docker | ||
|
||
build_docker_images | ||
start_service | ||
|
||
validate_microservice | ||
|
||
stop_docker | ||
echo y | docker system prune | ||
|
||
} | ||
|
||
main |