Skip to content

Commit 113f555

Browse files
Update quota_check_params.sh
1 parent 5b64296 commit 113f555

File tree

1 file changed

+248
-0
lines changed

1 file changed

+248
-0
lines changed
Lines changed: 248 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,249 @@
1+
#!/bin/bash
2+
# VERBOSE=false
13

4+
MODELS=""
5+
REGIONS=""
6+
VERBOSE=false
7+
8+
while [[ $# -gt 0 ]]; do
9+
case "$1" in
10+
--models)
11+
MODELS="$2"
12+
shift 2
13+
;;
14+
--regions)
15+
REGIONS="$2"
16+
shift 2
17+
;;
18+
--verbose)
19+
VERBOSE=true
20+
shift
21+
;;
22+
*)
23+
echo "Unknown option: $1"
24+
exit 1
25+
;;
26+
esac
27+
done
28+
29+
# Fallback to defaults if not provided
30+
[[ -z "$MODELS" ]]
31+
[[ -z "$REGIONS" ]]
32+
33+
echo "Models: $MODELS"
34+
echo "Regions: $REGIONS"
35+
echo "Verbose: $VERBOSE"
36+
37+
for arg in "$@"; do
38+
if [ "$arg" = "--verbose" ]; then
39+
VERBOSE=true
40+
fi
41+
done
42+
43+
log_verbose() {
44+
if [ "$VERBOSE" = true ]; then
45+
echo "$1"
46+
fi
47+
}
48+
49+
# Default Models and Capacities (Comma-separated in "model:capacity" format)
50+
DEFAULT_MODEL_CAPACITY="gpt-4o:50"
51+
# Convert the comma-separated string into an array
52+
IFS=',' read -r -a MODEL_CAPACITY_PAIRS <<< "$DEFAULT_MODEL_CAPACITY"
53+
54+
echo "🔄 Fetching available Azure subscriptions..."
55+
SUBSCRIPTIONS=$(az account list --query "[?state=='Enabled'].{Name:name, ID:id}" --output tsv)
56+
SUB_COUNT=$(echo "$SUBSCRIPTIONS" | wc -l)
57+
58+
if [ "$SUB_COUNT" -eq 0 ]; then
59+
echo "❌ ERROR: No active Azure subscriptions found. Please log in using 'az login' and ensure you have an active subscription."
60+
exit 1
61+
elif [ "$SUB_COUNT" -eq 1 ]; then
62+
# If only one subscription, automatically select it
63+
AZURE_SUBSCRIPTION_ID=$(echo "$SUBSCRIPTIONS" | awk '{print $2}')
64+
if [ -z "$AZURE_SUBSCRIPTION_ID" ]; then
65+
echo "❌ ERROR: No active Azure subscriptions found. Please log in using 'az login' and ensure you have an active subscription."
66+
exit 1
67+
fi
68+
echo "✅ Using the only available subscription: $AZURE_SUBSCRIPTION_ID"
69+
else
70+
# If multiple subscriptions exist, prompt the user to choose one
71+
echo "Multiple subscriptions found:"
72+
echo "$SUBSCRIPTIONS" | awk '{print NR")", $1, "-", $2}'
73+
74+
while true; do
75+
echo "Enter the number of the subscription to use:"
76+
read SUB_INDEX
77+
78+
# Validate user input
79+
if [[ "$SUB_INDEX" =~ ^[0-9]+$ ]] && [ "$SUB_INDEX" -ge 1 ] && [ "$SUB_INDEX" -le "$SUB_COUNT" ]; then
80+
AZURE_SUBSCRIPTION_ID=$(echo "$SUBSCRIPTIONS" | awk -v idx="$SUB_INDEX" 'NR==idx {print $2}')
81+
echo "✅ Selected Subscription: $AZURE_SUBSCRIPTION_ID"
82+
break
83+
else
84+
echo "❌ Invalid selection. Please enter a valid number from the list."
85+
fi
86+
done
87+
fi
88+
89+
90+
# Set the selected subscription
91+
az account set --subscription "$AZURE_SUBSCRIPTION_ID"
92+
echo "🎯 Active Subscription: $(az account show --query '[name, id]' --output tsv)"
93+
94+
# Default Regions to check (Comma-separated, now configurable)
95+
DEFAULT_REGIONS="eastus,uksouth,eastus2,northcentralus,swedencentral,westus,westus2,southcentralus,canadacentral"
96+
IFS=',' read -r -a DEFAULT_REGION_ARRAY <<< "$DEFAULT_REGIONS"
97+
98+
# Read parameters (if any)
99+
IFS=',' read -r -a USER_PROVIDED_PAIRS <<< "$MODELS"
100+
USER_REGION="$REGIONS"
101+
102+
IS_USER_PROVIDED_PAIRS=false
103+
104+
if [ ${#USER_PROVIDED_PAIRS[@]} -lt 1 ]; then
105+
echo "No parameters provided, using default model-capacity pairs: ${MODEL_CAPACITY_PAIRS[*]}"
106+
else
107+
echo "Using provided model and capacity pairs: ${USER_PROVIDED_PAIRS[*]}"
108+
IS_USER_PROVIDED_PAIRS=true
109+
MODEL_CAPACITY_PAIRS=("${USER_PROVIDED_PAIRS[@]}")
110+
fi
111+
112+
declare -a FINAL_MODEL_NAMES
113+
declare -a FINAL_CAPACITIES
114+
declare -a TABLE_ROWS
115+
116+
for PAIR in "${MODEL_CAPACITY_PAIRS[@]}"; do
117+
MODEL_NAME=$(echo "$PAIR" | cut -d':' -f1 | tr '[:upper:]' '[:lower:]')
118+
CAPACITY=$(echo "$PAIR" | cut -d':' -f2)
119+
120+
if [ -z "$MODEL_NAME" ] || [ -z "$CAPACITY" ]; then
121+
echo "❌ ERROR: Invalid model and capacity pair '$PAIR'. Both model and capacity must be specified."
122+
exit 1
123+
fi
124+
125+
FINAL_MODEL_NAMES+=("$MODEL_NAME")
126+
FINAL_CAPACITIES+=("$CAPACITY")
127+
128+
done
129+
130+
echo "🔄 Using Models: ${FINAL_MODEL_NAMES[*]} with respective Capacities: ${FINAL_CAPACITIES[*]}"
131+
echo "----------------------------------------"
132+
133+
# Check if the user provided a region, if not, use the default regions
134+
if [ -n "$USER_REGION" ]; then
135+
echo "🔍 User provided region: $USER_REGION"
136+
IFS=',' read -r -a REGIONS <<< "$USER_REGION"
137+
else
138+
echo "No region specified, using default regions: ${DEFAULT_REGION_ARRAY[*]}"
139+
REGIONS=("${DEFAULT_REGION_ARRAY[@]}")
140+
APPLY_OR_CONDITION=true
141+
fi
142+
143+
echo "✅ Retrieved Azure regions. Checking availability..."
144+
INDEX=1
145+
146+
VALID_REGIONS=()
147+
for REGION in "${REGIONS[@]}"; do
148+
log_verbose "----------------------------------------"
149+
log_verbose "🔍 Checking region: $REGION"
150+
151+
QUOTA_INFO=$(az cognitiveservices usage list --location "$REGION" --output json | tr '[:upper:]' '[:lower:]')
152+
if [ -z "$QUOTA_INFO" ]; then
153+
log_verbose "⚠️ WARNING: Failed to retrieve quota for region $REGION. Skipping."
154+
continue
155+
fi
156+
157+
TEXT_EMBEDDING_AVAILABLE=false
158+
AT_LEAST_ONE_MODEL_AVAILABLE=false
159+
TEMP_TABLE_ROWS=()
160+
161+
for index in "${!FINAL_MODEL_NAMES[@]}"; do
162+
MODEL_NAME="${FINAL_MODEL_NAMES[$index]}"
163+
REQUIRED_CAPACITY="${FINAL_CAPACITIES[$index]}"
164+
FOUND=false
165+
INSUFFICIENT_QUOTA=false
166+
167+
if [ "$MODEL_NAME" = "text-embedding-ada-002" ]; then
168+
MODEL_TYPES=("openai.standard.$MODEL_NAME")
169+
else
170+
MODEL_TYPES=("openai.standard.$MODEL_NAME" "openai.globalstandard.$MODEL_NAME")
171+
fi
172+
173+
for MODEL_TYPE in "${MODEL_TYPES[@]}"; do
174+
FOUND=false
175+
INSUFFICIENT_QUOTA=false
176+
log_verbose "🔍 Checking model: $MODEL_NAME with required capacity: $REQUIRED_CAPACITY ($MODEL_TYPE)"
177+
178+
MODEL_INFO=$(echo "$QUOTA_INFO" | awk -v model="\"value\": \"$MODEL_TYPE\"" '
179+
BEGIN { RS="},"; FS="," }
180+
$0 ~ model { print $0 }
181+
')
182+
183+
if [ -z "$MODEL_INFO" ]; then
184+
FOUND=false
185+
log_verbose "⚠️ WARNING: No quota information found for model: $MODEL_NAME in region: $REGION for model type: $MODEL_TYPE."
186+
continue
187+
fi
188+
189+
if [ -n "$MODEL_INFO" ]; then
190+
FOUND=true
191+
CURRENT_VALUE=$(echo "$MODEL_INFO" | awk -F': ' '/"currentvalue"/ {print $2}' | tr -d ',' | tr -d ' ')
192+
LIMIT=$(echo "$MODEL_INFO" | awk -F': ' '/"limit"/ {print $2}' | tr -d ',' | tr -d ' ')
193+
194+
CURRENT_VALUE=${CURRENT_VALUE:-0}
195+
LIMIT=${LIMIT:-0}
196+
197+
CURRENT_VALUE=$(echo "$CURRENT_VALUE" | cut -d'.' -f1)
198+
LIMIT=$(echo "$LIMIT" | cut -d'.' -f1)
199+
200+
AVAILABLE=$((LIMIT - CURRENT_VALUE))
201+
log_verbose "✅ Model: $MODEL_TYPE | Used: $CURRENT_VALUE | Limit: $LIMIT | Available: $AVAILABLE"
202+
203+
if [ "$AVAILABLE" -ge "$REQUIRED_CAPACITY" ]; then
204+
FOUND=true
205+
if [ "$MODEL_NAME" = "text-embedding-ada-002" ]; then
206+
TEXT_EMBEDDING_AVAILABLE=true
207+
fi
208+
AT_LEAST_ONE_MODEL_AVAILABLE=true
209+
TEMP_TABLE_ROWS+=("$(printf "| %-4s | %-20s | %-43s | %-10s | %-10s | %-10s |" "$INDEX" "$REGION" "$MODEL_TYPE" "$LIMIT" "$CURRENT_VALUE" "$AVAILABLE")")
210+
else
211+
INSUFFICIENT_QUOTA=true
212+
fi
213+
fi
214+
215+
if [ "$FOUND" = false ]; then
216+
log_verbose "❌ No models found for model: $MODEL_NAME in region: $REGION (${MODEL_TYPES[*]})"
217+
218+
elif [ "$INSUFFICIENT_QUOTA" = true ]; then
219+
log_verbose "⚠️ Model $MODEL_NAME in region: $REGION has insufficient quota (${MODEL_TYPES[*]})."
220+
fi
221+
done
222+
done
223+
224+
if { [ "$IS_USER_PROVIDED_PAIRS" = true ] && [ "$INSUFFICIENT_QUOTA" = false ] && [ "$FOUND" = true ]; } || { [ "$APPLY_OR_CONDITION" != true ] || [ "$AT_LEAST_ONE_MODEL_AVAILABLE" = true ]; }; then
225+
VALID_REGIONS+=("$REGION")
226+
TABLE_ROWS+=("${TEMP_TABLE_ROWS[@]}")
227+
INDEX=$((INDEX + 1))
228+
elif [ ${#USER_PROVIDED_PAIRS[@]} -eq 0 ]; then
229+
echo "🚫 Skipping $REGION as it does not meet quota requirements."
230+
fi
231+
232+
done
233+
234+
if [ ${#TABLE_ROWS[@]} -eq 0 ]; then
235+
echo "--------------------------------------------------------------------------------------------------------------------"
236+
237+
echo "❌ No regions have sufficient quota for all required models. Please request a quota increase: https://aka.ms/oai/stuquotarequest"
238+
else
239+
echo "---------------------------------------------------------------------------------------------------------------------"
240+
printf "| %-4s | %-20s | %-43s | %-10s | %-10s | %-10s |\n" "No." "Region" "Model Name" "Limit" "Used" "Available"
241+
echo "---------------------------------------------------------------------------------------------------------------------"
242+
for ROW in "${TABLE_ROWS[@]}"; do
243+
echo "$ROW"
244+
done
245+
echo "---------------------------------------------------------------------------------------------------------------------"
246+
echo "➡️ To request a quota increase, visit: https://aka.ms/oai/stuquotarequest"
247+
fi
248+
249+
echo "✅ Script completed."

0 commit comments

Comments
 (0)