From 406cd3364481cd8d541a91823d155dcdf56f6dd8 Mon Sep 17 00:00:00 2001 From: Kapil Vaswani Date: Thu, 7 Nov 2024 18:45:26 +0000 Subject: [PATCH] fixes --- Makefile | 15 ++++++++------- README.md | 4 ++-- examples/audio.mp3 | Bin 0 -> 14301 bytes 3 files changed, 10 insertions(+), 9 deletions(-) create mode 100644 examples/audio.mp3 diff --git a/Makefile b/Makefile index f2ed03c..89e709f 100755 --- a/Makefile +++ b/Makefile @@ -15,10 +15,11 @@ else echo "Unknown model" endif -export INPUT ?= ${PWD}/examples/audio.mp3 -export MOUNTED_INPUT ?= /examples/audio.mp3 +export INPUT_DIR ?= ${PWD}/examples +export MOUNTED_INPUT_DIR ?= /test +export INPUT_FILE ?= audio.mp3 export INJECT_HEADERS ?= openai-internal-enableasrsupport -export DETACHED ?= +export DETACHED ?= # Build commands @@ -76,10 +77,10 @@ run-server-whisper-gpu: # Containerized client deployments run-client-container: - docker run --net=host \ - attested-ohttp-client $(SCORING_ENDPOINT) -F "file=@${MOUNTED_INPUT}" --target-path ${TARGET_PATH} + docker run --net=host --volume ${INPUT_DIR}:${MOUNTED_INPUT_DIR} \ + attested-ohttp-client $(SCORING_ENDPOINT) -F "file=@${MOUNTED_INPUT_DIR}/${INPUT_FILE}" --target-path ${TARGET_PATH} run-client-container-aoai: - docker run --volume -e KMS_URL=${KMS} \ - attested-ohttp-client ${SCORING_ENDPOINT} -F "file=@${MOUNTED_INPUT}" --target-path ${TARGET_PATH} \ + docker run --volume ${INPUT_DIR}:${MOUNTED_INPUT_DIR} -e KMS_URL=${KMS} \ + attested-ohttp-client ${SCORING_ENDPOINT} -F "file=@${MOUNTED_INPUT_DIR}/${INPUT_FILE}" --target-path ${TARGET_PATH} \ -O "api-key: ${API_KEY}" -F "response_format=json" \ No newline at end of file diff --git a/README.md b/README.md index 4d76616..c698199 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ key management service](https://github.com/microsoft/azure-transparent-kms), it - [Azure AI Confidential Inferencing: Technical Deep Dive](https://techcommunity.microsoft.com/blog/azureconfidentialcomputingblog/azure-ai-confidential-inferencing-technical-deep-dive/4253150) -## Building +## Build The repo supports build and development using GitHub Codespaces and devcontainers. The repository includes a devcontainer configuration that installs all dependencies. @@ -18,7 +18,7 @@ Build the attested OHTTP server container. make build-server-container ``` -## Testing +## Test For local testing, this repository includes a sample whisper container. diff --git a/examples/audio.mp3 b/examples/audio.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..b07ac4477ef633ca9479b4baf098e85da9b8017a GIT binary patch literal 14301 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