feat: register task by conditions

This commit is contained in:
snsd0805 2024-05-11 17:18:01 +08:00
parent a6db247d35
commit 89c187748e
Signed by: snsd0805
GPG Key ID: 569349933C77A854
2 changed files with 24 additions and 3 deletions

1
abi/Scheduler.abi Normal file
View File

@ -0,0 +1 @@
[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"provider","type":"address"},{"indexed":false,"internalType":"string","name":"dataImage","type":"string"},{"indexed":false,"internalType":"string","name":"trainImage","type":"string"}],"name":"StartRun","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"","type":"uint256"}],"name":"choose","type":"event"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"clusters","outputs":[{"internalType":"address","name":"provider","type":"address"},{"internalType":"uint256","name":"gpuId","type":"uint256"},{"internalType":"uint256","name":"clusterSize","type":"uint256"},{"internalType":"bool","name":"available","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"clusterIndex","type":"uint256"}],"name":"getClusterInfo","outputs":[{"components":[{"internalType":"address","name":"provider","type":"address"},{"internalType":"uint256","name":"gpuId","type":"uint256"},{"internalType":"uint256","name":"clusterSize","type":"uint256"},{"internalType":"bool","name":"available","type":"bool"}],"internalType":"struct Scheduler.Cluster","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getClusters","outputs":[{"components":[{"internalType":"address","name":"provider","type":"address"},{"internalType":"uint256","name":"gpuId","type":"uint256"},{"internalType":"uint256","name":"clusterSize","type":"uint256"},{"internalType":"bool","name":"available","type":"bool"}],"internalType":"struct Scheduler.Cluster[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumberOfClusters","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"gpuId","type":"uint256"},{"internalType":"uint256","name":"clusterSize","type":"uint256"}],"name":"registerCluster","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"dataImage","type":"string"},{"internalType":"string","name":"trainImage","type":"string"},{"internalType":"uint256","name":"gpuId","type":"uint256"},{"internalType":"uint256","name":"clusterSize","type":"uint256"}],"name":"registerTaskWithConditions","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tasks","outputs":[{"internalType":"address","name":"provider","type":"address"},{"internalType":"address","name":"client","type":"address"},{"internalType":"string","name":"dataImage","type":"string"},{"internalType":"string","name":"trainImage","type":"string"},{"internalType":"uint256","name":"status","type":"uint256"}],"stateMutability":"view","type":"function"}]

View File

@ -17,27 +17,47 @@ contract Scheduler {
uint256 status;
}
event StartRun(address provider, string dataImage, string trainImage);
uint256 private randomNumber;
Cluster[] public clusters;
Task[] public tasks;
function getRandomNumber() internal returns (uint256) {
function _getRandomNumber() internal returns (uint256) {
randomNumber = uint (keccak256(abi.encodePacked (msg.sender, block.timestamp, randomNumber)));
return randomNumber;
}
function registerCluster(uint256 gpuId, uint256 clusterSize) public {
address provider = msg.sender;
clusters.push(Cluster(provider, gpuId, clusterSize, false));
clusters.push(Cluster(provider, gpuId, clusterSize, true));
}
function registerTaskWithSpecificCluster(string memory dataImage, string memory trainImage, uint256 clusterIndex) public {
function _registerTaskWithSpecificCluster(string memory dataImage, string memory trainImage, uint256 clusterIndex) internal {
require(clusters[clusterIndex].available, "This GPU Cluster has been chosen");
clusters[clusterIndex].available = false;
address provider = clusters[clusterIndex].provider;
address client = msg.sender;
tasks.push(Task(provider, client, dataImage, trainImage, 1));
emit StartRun(provider, dataImage, trainImage);
}
function registerTaskWithConditions(string memory dataImage, string memory trainImage, uint256 gpuId, uint256 clusterSize) public {
uint256[] memory suitable_clusters = new uint256[](clusters.length);
uint256 index = 0;
for (uint256 i=0; i<clusters.length; i++) {
if (clusters[i].gpuId == gpuId && clusters[i].clusterSize == clusterSize && clusters[i].available) {
suitable_clusters[index] = i;
index += 1;
}
}
require(index>0, "No suitable cluster.");
// random
index = _getRandomNumber() % index;
_registerTaskWithSpecificCluster(dataImage, trainImage, suitable_clusters[index]);
}
function getNumberOfClusters() public view returns (uint256) {